【问题标题】:MySQL 'Truncated incorrect INTEGER value'MySQL '截断不正确的 INTEGER 值'
【发布时间】:2011-06-24 05:33:13
【问题描述】:

当我运行以下 UPDATE 查询时,我收到一个奇怪的“截断不正确的 INTEGER 值”错误:

update tbl
set projectNumber = right(comments, 7)
where createdBy = 'me'
and length(CONVERT(right(comments, 7), SIGNED INTEGER)) = 7 
and CONVERT(right(comments, 7), SIGNED INTEGER) > 0
and CONVERT(right(comments, 7), SIGNED INTEGER) is not null
and createdOn > '2011-01-31 12:00:00'
and projectNumber is null

projectNumber 是 varchar(10)。

当我将它作为直接选择运行时,我没有收到错误,并且我看到了预期的结果。有任何想法吗?本质上,我正在尝试更新 projectNumber 字段,其中导入注释中的 cmets 结尾是 7 个数字字符(但 projectNumber 不是 总是 7 个数字,这就是该字段是 varchar(10) 的原因) .

【问题讨论】:

    标签: mysql


    【解决方案1】:

    Toby Speight 在his answer 中概述了该问题的一种解决方案。 我不知道是否有人会像我一样愚蠢,但它可能与谁有关:

    我在尝试将列 IsDeleted 的数据类型从 VARCHAR ('Y' => true, 'N' => false) 修改为 BIT 时遇到错误代码 1292。

    要解决此问题:将所有“Y”更新为“1”(UPDATE table SET isDeleted = '1' WHERE isDeleted = 'Y')并将所有“N”更新为“0”,尝试再次修改列类型并且修改了数据类型加上“1”列包含 TRUE现在反之亦然。

    【讨论】:

      【解决方案2】:

      如其他答案所述,这是 2019 年的错误,导致查询无法运行。即使存在无法转换为数字的字符串也要运行查询,只需使用UPDATE IGNORE

      例如原始代码的最小版本:

      UPDATE IGNORE tbl
      SET projectNumber = RIGHT(comments, 7)
      WHERE CONVERT(RIGHT(COMMENTS, 7), SIGNED INTEGER) > 0
      

      【讨论】:

      • 如果您使用 INSERT INTO,请同样考虑。您应该在查询中添加“IGNORE”:INSERT IGNORE INTO tbl(a,b,c) VALUES (1, CONVERT(RIGHT(COMMENTS, 7), SIGNED INTEGER), 3)
      • 使用 IGNORE 真的安全吗?
      • UPDATE IGNORE 跳过无法转换的行。如果这在您的用例中不行,您应该确保所有行都可以转换,然后在没有 IGNORE 的情况下运行查询。
      【解决方案3】:

      我找到了一种开箱即用的解决方案,可以轻松实施。 该解决方案与 MS SQL Server 中的SET ANSI_WARNING OFF 非常相似。

      在 MySQL 中,首先您需要使用以下命令检查“sql_mode”是否设置了哪些配置:

      SHOW VARIABLES LIKE 'sql_mode';
      

      或者在下面使用:

      SELECT @@GLOBAL.sql_mode;
      

      CSV 中可能有以下几组值。

      ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

      根据您的错误,您可以使用以下命令删除设置并重置它:

      SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
      

      通过使用上述命令重置它。在我的情况下,它已经解决了类似的问题“截断不正确的整数值”。我希望其他面临此问题的用户也可以使用它。

      有关此“sql_mode”的更多详细信息,请参阅this

      希望这将被充分利用!

      【讨论】:

        【解决方案4】:

        如果您对列数据使用文本类型并且尝试将默认值设置为0,那么只需将其设置为NULL

        ALTER TABLE `__table__` 
        CHANGE `__column_name__old__` `__column_name__new__` 
        INT(4) NOT NULL DEFAULT '0';
        

        【讨论】:

          【解决方案5】:

          此警告的另一个常见原因是要转换的字符串中的空格。在convert() 之前使用trim() 可以消除这种情况。

          【讨论】:

            【解决方案6】:

            这不是错误。当您要求将非数字转换为整数时,这是来自 CONVERT() 的警告;

            在控制台中运行这些查询以查看:

            mysql> SELECT CONVERT(right('1s23d45678', 7), SIGNED INTEGER);
            +-------------------------------------------------+
            | CONVERT(right('1s23d45678', 7), SIGNED INTEGER) |
            +-------------------------------------------------+
            |                                               3 |
            +-------------------------------------------------+
            1 row in set, 1 warning (0.00 sec)
            
            mysql> SHOW WARNINGS;
            +---------+------+----------------------------------------------+
            | Level   | Code | Message                                      |
            +---------+------+----------------------------------------------+
            | Warning | 1292 | Truncated incorrect INTEGER value: '3d45678' |
            +---------+------+----------------------------------------------+
            1 row in set (0.00 sec)
            

            正如我所说,这是一个警告,而不是错误。您的查询应该正确地进行更新。

            【讨论】:

            • 有趣。它确实显示错误代码 1292(如您的示例),但我可以确认更新 not 正在运行。我必须有一个设置来中止更新中的警告吗?我会继续挖掘。
            • 我怀疑你的服务器在TRADITIONAL SQL 模式下运行,它将所有警告转换为错误。 dev.mysql.com/doc/refman/5.5/en/…
            • 对。我实际上决定只使用一个正则表达式(和 right(cmets, 7) REGEXP '^[0-9]+$')并忘记转换废话。工作得很好。非常感谢您的帮助。
            • 现在是2019版的错误Ver 14.14 Distrib 5.7.26
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多