2011-04-09 134 views
22

我收到錯誤BIGINT UNSIGNED值超出範圍

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後,錯誤開始出現

請幫忙嗎?

+0

給我們一個以日期保存的數據的例子,我懷疑它與這個有關。 – Khez 2011-04-09 12:44:51

+1

我猜Khez是正確的,問題是一些大於1301980250的日期值。 – 2011-04-09 13:09:22

+0

我仍然懷疑它會導致那個特定的錯誤,但它仍然是開始複製錯誤的一點。 – Khez 2011-04-09 13:37:46

回答

52

我最近跑了進入這個,並找到最簡單的解決方案,將任何UNSIGNED整數轉換爲SIGNED。

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

奇怪,但工作。 – TranslucentCloud 2016-08-02 10:37:00

4

2011-04-04 22:10:50 PDT(2011-04-05 05:10:50 utc)之後的任何日期值都會導致這個錯誤,因爲這會導致表達式爲負數。

14

這個問題是由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(還沒有檢查這一點)
+13

@wallyk - 回答我自己的問題並沒有給我任何觀點,所以我沒有這樣做來提高我的聲望。我在MySQL IRC上找到了答案。我非常感謝您的時間和精力,並提高了您的答覆。但是你沒有提供解決方案,我想在這裏分享。 – 2011-04-13 12:00:55

+5

如果你不能或不想修改配置文件。你也可以使用下面的語句:'SET sql_mode ='NO_UNSIGNED_SUBTRACTION';' – 2014-04-17 13:12:46

+1

@wallyk和其他任何人現在閱讀 - 這是不正確的。您可以在提問時回答自己的問題。 Stackoverflow需要有良好記錄的答案的好問題,誰提供它並不重要。 – Luke 2015-07-24 14:12:11

1

也許你可以使用cast

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

1

這有時可以通過數據空值造成的。

使用IFNULL設置默認值(時間戳可能爲0是一個可憐的默認,實際上在這種情況下,你可能會更好拒絕和空日期在WHERE子句中)

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

+0

在我的情況下,我在一個0值的unsigned int列中做了value = value-1000。 – 2017-12-03 21:28:31

0

沒人提到log()函數只是爲嚴格正面的參數定義的。在log()中使用substractions時注意這一點。

至於原始問題,解決問題的關鍵因素是告訴我們日期列的數據類型。如果它是UNSIGNED,MySQL可能不喜歡它。