У меня есть таблица MySQL t
с более чем 150 миллионами строк. Одним из столбцов (c
) был VARCHAR(64)
содержащий 64-разрядное шестнадцатеричное число. Чтобы сэкономить место и ускорить работу, я хотел декодировать шестнадцатеричный код и превратить его в столбец BINARY(32)
.
Мой план состоял в том, чтобы использовать три запроса:
ALTER TABLE t CHANGE cc BINARY(64) NOT NULL;
UPDATE t SET c=UNHEX(c);
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
дает мне синтаксическую ошибку.
Чтобы обойти #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';
Для безопасности я снова включу строгий режим после того, как я закончил усечение столбцов.