我突然在我的生产站点上遇到一个查询,没有返回结果但也没有产生错误,它只是返回零行。来发现一个子查询产生了以下错误:
错误代码:1690。BIGINT UNSIGNED 值超出“( s
. subscriber_count
- ( s
. subscribed_count
- s
. unsubscribed_count
))”中的范围
我的数据集看起来像:
我遇到了/sf/answers/824663381/并没有真正尝试过,因为我想了解为什么会产生此错误。一个评论提到了否定表达,但在我的情况下unsubscribed_count
没有小于subscribed_count
.
谁能帮我理解为什么我会看到这个错误?
减法 ( -
) 导致错误。这是悲观的。你坚持使用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 函数和运算符”。”
归档时间: |
|
查看次数: |
5998 次 |
最近记录: |