【问题标题】:SQL Mode Is NO_UNSIGNED_SUBTRACTION But Still Getting Out of Range ErrorSQL 模式为 NO_UNSIGNED_SUBTRACTION 但仍然超出范围错误
【发布时间】:2017-08-29 01:56:58
【问题描述】:

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

UPDATE table SET inventory = inventory - 1

我不明白为什么,因为我认为新的 sql_mode 会将行为恢复到 5.5 之前的版本?我不想为了使简单的算术工作而开始在我的语句中转换所有内容,所以我认为的逻辑解决方案是将我所有的无符号整数列转换为有符号整数,但主自动增量键除外。

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

【问题讨论】:

    标签: mysql integer-overflow unsigned-integer


    【解决方案1】:

    我做了更多的挖掘并找到了我的答案,并想在这里分享给将来遇到这个问题的任何人。 SQL 模式 NO_UNSIGNED_SUBTRACTION 确实有效,并且没有为该表/列恢复。简而言之,问题在于该表上有一个触发器,我从 2009 年的一个有点相关的MySQL bug report 中发现,正如 Davi Arnaut 的用户 cmets 所述,触发器和准备好的语句使用它们时使用的 SQL 模式被创造了……啊!所以,我重新定义了触发器,一切都按预期工作。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多