当我运行以下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)的原因)
答案 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,反之亦然。