SQL模式是NO_UNSIGNED_SUBTRACTION但仍然超出范围错误

时间:2017-08-29 01:56:59

标签: mysql integer-overflow unsigned-integer

将客户端从MySQL 5.4升级到5.7后,我开始收到“BIGINT UNSIGNED值超出范围......”错误。我编辑了my.cnf并设置了sql_mode =“NO_UNSIGNED_SUBTRACTION”,并使用了SHOW VARIABLES来确保它确实使用了该模式。这确实解决了应用程序中的初始问题,但今天无符号的int列抛出相同的错误(BTW库存为2)......

UPDATE table SET inventory = inventory - 1

我不明白为什么因为我认为新的sql_mode会将行为还原到5.5之前?我不想在我的语句中开始编译所有内容只是为了进行简单的算术运算,因此我认为逻辑解决方案只是将我的所有unsigned int cols转换为signed int,除了主要的自动增量键。

这是逃避这些超出范围错误的最佳解决方案吗?

1 个答案:

答案 0 :(得分:0)

我做了一些挖掘并找到了我的答案,并希望在此分享给将来坚持这个的人。 SQL模式NO_UNSIGNED_SUBTRACTION确实正在运行,并且没有为此表/列恢复。简而言之,问题是该表上有一个触发器,我从2009年的某个相关MySQL bug report中发现,如Davi Arnaut在用户评论中所述,触发器和预处理语句使用正在使用的SQL模式当他们被创造出来的时候......啊!所以,我重新定义了触发器,一切都按预期工作。