使用ALTER TABLE截断MySQL中的BINARY列

时间:2017-12-13 11:26:27

标签: mysql binary-data truncate alter-table truncation

我有一个超过1.5亿行的MySQL表t。其中一列(c)是包含64位十六进制数的VARCHAR(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;

  4. 前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会给我一个语法错误。

1 个答案:

答案 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';

为了安全起见,我将在完成截断列后重新启用严格模式。