BIGINT UNSIGNED 值超出范围

Web*_*net 4 mysql

我突然在我的生产站点上遇到一个查询,没有返回结果但也没有产生错误,它只是返回零行。来发现一个子查询产生了以下错误:

错误代码:1690。BIGINT UNSIGNED 值超出“( s. subscriber_count- ( s. subscribed_count- s. unsubscribed_count))”中的范围

我的数据集看起来像:

在此处输入图片说明

我遇到了/sf/answers/824663381/并没有真正尝试过,因为我想了解为什么会产生此错误。一个评论提到了否定表达,但在我的情况下unsubscribed_count没有小于subscribed_count.

谁能帮我理解为什么我会看到这个错误?

Ric*_*mes 7

减法 ( -) 导致错误。这是悲观的。你坚持使用CAST(... AS SIGNED)来避免错误。

SHOW VARIABLES LIKE 'sql_mode';
Run Code Online (Sandbox Code Playgroud)

看看有没有 NO_UNSIGNED_SUBTRACTION

对于“基本原理”,最好引用有关该主题的一些(许多)错误报告:

https://bugs.mysql.com/bug.php?id=61410

这是 5.5 中行为的有意改变。对于那些需要这种语句来工作并产生有意义的(不同于 5.5 之前的)结果的人,有 NO_UNSIGNED_SUBTRACTION SQL 模式(http://dev.mysql.com/doc/refman/5.5/en/server-sql- mode.html#sqlmode_no_unsigned_subtractio... )。

https://bugs.mysql.com/bug.php?id=46799

http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

默认情况下,整数值之间的减法(其中一个是 UNSIGNED 类型)会产生一个无符号结果。如果结果本来是负数,则它成为最大整数值。如果启用了 NO_UNSIGNED_SUBTRACTION SQL 模式,则结果是否定的。

https://bugs.mysql.com/bug.php?id=21070

“警告:当您在一个 UNSIGNED 类型的整数值之间使用减法时,结果是无符号的,除非启用了 NO_UNSIGNED_SUBTRACTION SQL 模式。请参阅第 12.8 节,“Cast 函数和运算符”。”