我收到错误
BIGINT UNSIGNED值超出范围'(1301980250 -
mydb
。news_articles
。date
)'
当我运行查询时
SELECT *, ((1 / log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight;
删除ORDER BY条件,也会删除错误。我该如何解决?
更新:日期字段包含unix时间戳(例如:1298944082)。将MySQL从5.0.x升级到5.5.x后,错误开始出现
请帮忙吗?
答案 0 :(得分:73)
我最近碰到了这个并找到了最合理的解决方案,只需将任何UNSIGNED整数转换为SIGNED。
SELECT *, ((1 / log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight
答案 1 :(得分:16)
问题是由wallyk建议的无符号整数溢出引起的。它可以通过
解决SELECT *, ((1 / log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight;
(这个对我有用)
`NO_UNSIGNED_SUBTRACTION
(尚未检查)答案 2 :(得分:4)
2011-04-04 22:10:50 PDT(2011-04-05 05:10:50 utc)之后的任何日期值都会导致此错误,因为这会使表达式为负。
答案 3 :(得分:4)
这有时可能是由数据中的空值引起的。
使用IFNULL来设置一个默认值(时间戳可能为0是一个很差的默认值,实际上在这种情况下你最好排除WHERE子句中的null和null日期)
SELECT (123456 - IFNULL(date, 0)) AS leVar
答案 4 :(得分:2)
也许您可以使用cast
SELECT *, ((1 / log(1301980250 - cast(date AS SIGNED))) * 175) as weight FROM news_articles ORDER BY weight;
答案 5 :(得分:2)
没有人提到log()函数只是为严格的正参数定义的。在log()中使用substractions时要注意这一点。
至于原始问题,解决的关键因素是告诉我们日期列的数据类型。如果它是UNSIGNED,MySQL可能不喜欢它。
规则是MySQL具有较差的算术算法,并且当A的编码字节数少于B AND B时,无法弄清楚如何将操作数B减去另一个A(= do A-B)。甲
e.g。 A = 12并且是SMALLINT,B = 13 AS INT,那么MySQL无法弄清楚A-B是什么(-1!)
要制作MySQL内容,只需扩展操作数A的编码长度。如何?使用CAST(),或将A乘以十进制数。
正如人们所看到的,溢出问题不是处理MySQL算术中的符号问题。 一个微处理器,或更好的人类,没有问题来执行这种算术......
使用CAST()是一种方式,或者简而言之,只需通过将操作数A乘以1来激发隐式转换。(或1.0):
e.g
1.*A - B
答案 6 :(得分:0)
我刚遇到这个问题,对一个字段进行更新,结果结果小于0。
解决方案:请确认没有任何更新导致未签名字段的结果小于0。