BIGINT UNSIGNED值超出范围

Joy*_*abu 39 mysql biginteger

我收到了错误

BIGINT UNSIGNED值超出范围中的'(1301980250 - ..mydb )'news_articlesdate

当我运行查询

SELECT *, ((1 / log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight;
Run Code Online (Sandbox Code Playgroud)

删除ORDER BY条件也会删除错误.我该如何解决?

更新:日期字段包含unix时间戳(例如:1298944082).将MySQL从5.0.x升级到5.5.x后,错误开始出现

有什么帮助吗?

ab5*_*act 76

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

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


Joy*_*abu 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(尚未检查)

  • @wallyk - 回答我自己的问题没有给我任何意见,所以我没有这样做是为了提高我的声誉.我在MySQL IRC找到了答案.我非常感谢您的时间和精力,并对您的回复进行了投票.但是你没有提供问题的解决方案,我想在这里分享. (13认同)
  • 如果您不能或不想修改配置文件.您还可以使用以下语句:`SET sql_mode ='NO_UNSIGNED_SUBTRACTION';` (5认同)

Ian*_*ick 7

这有时可能是由数据中的空值引起的。

使用 IFNULL 设置默认值(时间戳可能为 0 是一个糟糕的默认值,实际上在这种情况下,您最好在 WHERE 子句中排除日期和空日期)

SELECT (123456 - IFNULL(date, 0)) AS leVar