我有一个超过1.5亿行的MySQL表t
。其中一列(c
)是包含64位十六进制数的VARCHAR(64)
。为了节省空间并加快速度,我想解码十六进制并将其转换为BINARY(32)
列。
我的计划是使用三个查询:
ALTER TABLE t CHANGE c c BINARY(64) NOT NULL;
UPDATE t SET c=UNHEX(c);
ALTER TABLE t CHANGE c c BINARY(32) NOT NULL;
前2个工作完美,但在第3个查询我得到错误:
#1265 - Data truncated for column 'c' at row 1
据我所知,我正在截断数据,这正是我想要的。我想摆脱0x00
末尾的32个BINARY(64)
字节,将其变为BINARY(32)
。
我尝试过的事情:
UPDATE t SET c=LEFT(c, 32);
似乎根本没有做任何事情。
使用ALTER IGNORE TABLE
会给我一个语法错误。
答案 0 :(得分: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';
为了安全起见,我将在完成截断列后重新启用严格模式。