BIGINT UNSIGNED值超出范围

时间:2011-04-09 12:41:45

标签: mysql biginteger

我收到错误

  

BIGINT UNSIGNED值超出范围'(1301980250 - mydbnews_articlesdate)'

当我运行查询时

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后,错误开始出现

请帮忙吗?

7 个答案:

答案 0 :(得分:73)

我最近碰到了这个并找到了最合理的解决方案,只需将任何UNSIGNED整数转换为SIGNED。

 SELECT *, ((1 / log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight

答案 1 :(得分:16)

问题是由wallyk建议的无符号整数溢出引起的。它可以通过

解决
  1. 使用SELECT *, ((1 / log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight;(这个对我有用) `
  2. 将my.cnf中的sql_mode参数更改为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。