在MySQL中使用ALTER TABLE截断BINARY列

3
我有一个MySQL表t,其中有超过1.5亿行。其中一列(c)是一个VARCHAR(64),包含一个64位的十六进制数。为了节省空间并加快速度,我想要解码十六进制并将其转换为BINARY(32)列。
我的计划是使用三个查询:
1. ALTER TABLE t CHANGE c c BINARY(64) NOT NULL; 2. UPDATE t SET c=UNHEX(c); 3. ALTER TABLE t CHANGE c c BINARY(32) NOT NULL;
前两个查询完美地运行了,但在第三个查询中,我收到了以下错误: #1265 - Data truncated for column 'c' at row 1
我明白我正在截断数据,这正是我想要的。我想要摆脱BINARY(64)末尾的32个0x00字节,将其转换为BINARY(32)。
我尝试过的方法: 1. UPDATE t SET c=LEFT(c, 32); 没有任何效果。 2. 使用ALTER IGNORE TABLE会导致语法错误。
1个回答

3
为了解决 #1265 - Data truncated for column ... 错误,你需要从全局的 sql_mode 变量中移除 STRICT_TRANS_TABLES 标志。
查询 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'; 为了安全起见,在截断列完成之后,我将重新启用严格模式。

这个解决方案对我很有效,非常感谢 @Jesbus - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接