MySQL'截断错误的INTEGER值'

Tod*_*arp 10 mysql

当我运行以下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
Run Code Online (Sandbox Code Playgroud)

projectNumber是varchar(10).

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

Mch*_*chl 12

这不是错误.当你要求它将非数字转换为整数时,这是来自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)
Run Code Online (Sandbox Code Playgroud)

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

  • 我怀疑你的服务器在`TRADITIONAL` SQL模式下运行,它将所有警告转换为错误.http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_traditional (3认同)
  • 对.我实际上决定只使用一个正则表达式(和右(评论,7)REGEXP'^ [0-9] + $')并忘记转换废话.工作得很好.非常感谢你的帮助. (3认同)
  • 现在在 2019 版本“Ver 14.14 Distrib 5.7.26”中出现错误。 (3认同)
  • 有趣.它确实说错误代码1292(就像你的例子),但我可以确认更新是*不*正在运行.我必须有一个设置来中止更新中的警告?我会继续挖掘. (2认同)

pun*_*sku 7

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

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

UPDATE IGNORE tbl
SET projectNumber = RIGHT(comments, 7)
WHERE CONVERT(RIGHT(COMMENTS, 7), SIGNED INTEGER) > 0
Run Code Online (Sandbox Code Playgroud)

  • UPDATE IGNORE 会跳过无法转换的行。如果这在您的用例中不行,您应该确保所有行都可以转换,然后运行查询而不忽略。 (2认同)

Rya*_*ley 6

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