MySQL'截断错误的INTEGER值'

时间:2011-02-09 15:27:56

标签: mysql

当我运行以下UPDATE查询时,我收到一个奇怪的'Truncated wrong INTEGER value'错误:

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字段,其中导入的注释中的注释结尾是7个数字字符(但是projectNumber不是总是 7数字,这就是字段为varchar(10)的原因)

6 个答案:

答案 0 :(得分:11)

这不是错误。当你要求它将非数字转换为整数时,这是来自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)

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

答案 1 :(得分:5)

此警告的另一个常见原因是要转换的字符串中有空格。在trim()之前使用convert()来摆脱它。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我找到了一个解决方案,该解决方案是开箱即用的,很容易实现。 该解决方案与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';

通过使用以上命令将其重置。在我的情况下,它已经解决了类似的问题“截断了错误的INTEGER值”。我希望它也可以从其他面临此问题的用户那里工作。

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

希望这将用光!

答案 4 :(得分:0)

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

因此,例如原始代码的最低版本:

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

答案 5 :(得分:0)

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

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

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