Усечение столбца BINARY в MySQL с использованием ALTER TABLE

0

У меня есть таблица MySQL t с более чем 150 миллионами строк. Одним из столбцов (c) был VARCHAR(64) содержащий 64-разрядное шестнадцатеричное число. Чтобы сэкономить место и ускорить работу, я хотел декодировать шестнадцатеричный код и превратить его в столбец BINARY(32).

Мой план состоял в том, чтобы использовать три запроса:

  1. ALTER TABLE t CHANGE cc BINARY(64) NOT NULL;

  2. UPDATE t SET c=UNHEX(c);

  3. ALTER TABLE t CHANGE cc BINARY(32) NOT NULL;

Первые 2 работали отлично, но в третьем запросе я получаю сообщение об ошибке:

#1265 - Data truncated for column 'c' at row 1

Я понимаю, что я усекаю данные, это именно то, что я хочу. Я хочу избавиться от 32 0x00 байт в конце BINARY(64) чтобы превратить его в BINARY(32).

Вещи, которые я пробовал:

  • UPDATE t SET c=LEFT(c, 32); казалось, ничего не делал.

  • Использование ALTER IGNORE TABLE дает мне синтаксическую ошибку.

Теги:
binary-data
truncate
alter-table
truncation

1 ответ

1

Чтобы обойти #1265 - Data truncated for column... ошибка, вы должны удалить флаг STRICT_TRANS_TABLES из глобальной переменной sql_mode.

Запрос SHOW VARIABLES LIKE 'sql_mode'; дал мне:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Поэтому я выполнил этот запрос:

SET GLOBAL sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Для безопасности я снова включу строгий режим после того, как я закончил усечение столбцов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню