【问题标题】:Truncating a BINARY column in MySQL using ALTER TABLE使用 ALTER TABLE 在 MySQL 中截断 BINARY 列
【发布时间】:2017-12-13 11:26:26
【问题描述】:

我有一个 MySQL 表 t 超过 1.5 亿行。其中一列 (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;

前两个运行良好,但在第三个查询中我收到错误:

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

我知道我正在截断数据,这正是我想要的。我想去掉BINARY(64)末尾的32个0x00字节,把它变成BINARY(32)

我尝试过的事情:

  • UPDATE t SET c=LEFT(c, 32); 似乎根本没有做任何事情。

  • 使用ALTER IGNORE TABLE 会出现语法错误。

【问题讨论】:

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


    【解决方案1】:

    要绕过#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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2012-01-03
    • 2012-04-09
    相关资源
    最近更新 更多