2012-07-28 46 views
12

我收到以下錯誤BIGINT無符號值超出範圍,我的SQL

#1690 - BIGINT UNSIGNED值超出範圍 '(legendsspawnsquantity - 。tmp_field)'

這裏是我的查詢

SELECT drops.common, drops.uncommon, drops.rare, drops.legendary, spawns . * 
    , (quantity - COUNT(game_moblist.spawn_id)) AS quantity_to_spawn 
    , mobs . * 
FROM spawns 
    LEFT JOIN mobs 
      USING (mob_id) 
    LEFT JOIN game_moblist 
      USING (spawn_id) 
    LEFT JOIN drops ON ( 
       SELECT MAX(level) 
       FROM drops 
       WHERE drops.type = mobs.drop_list 
        AND drops.level <= spawns.level) 
GROUP BY spawn_id 
HAVING quantity_to_spawn >=0 
     AND next_spawn <=0 

我一直盯着它,而查詢是多久,我很抱歉。

派生表 - 數game_moblist.spawn_id0所有可能行,但1(我刪除的行測試查詢)

的數據,否則是很長,無關我的問題,我認爲

任何想法如何解決這個錯誤?

+0

非常類似於https://stackoverflow.com/questions/5605085/bigint-unsigned-value-is-out-of-range – qdinar 2017-07-13 09:35:10

回答

26

請閱讀「Out-of-Range and Overflow Handling」。
它說:

在MySQL 5.5.5中,過程中的錯誤數字表達式評估結果溢出。例如,最大的帶符號BIGINT值是9223372036854775807,所以下面的表達式會產生一個錯誤。

mysql> SELECT 9223372036854775807 + 1; 

ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)' 

爲了使操作在這種情況下取​​得成功,值轉換爲無符號;

mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1; 
+-------------------------------------------+ 
| CAST(9223372036854775807 AS UNSIGNED) + 1 | 
+-------------------------------------------+ 
|      9223372036854775808 | 
+-------------------------------------------+ 

對以下部分查詢進行更改將解決該問題。

(CAST(quantity AS SIGNED) - COUNT(game_moblist.spawn_id)) AS quantity_to_spawn 

否則,您可能需要更改未簽名操作中的sql_mode

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; 

然後運行您的查詢以獲得所需的輸出。也

看到類似的帖子回答了一個論壇here

+0

鏈接要注意的要點是:'整數值之間的減法,其中一個是UNSIGNED類型的,默認情況下會產生一個無符號結果。' – arun 2014-10-28 01:40:36

2

我真的發現這個問題,爲什麼我正在尋找解決方案。如果您遇到同樣的問題,請嘗試禁用「無符號」參數。

這很可能是你的代碼在這裏失敗:

(
quantity - COUNT(game_moblist.spawn_id) 
) 

因爲如果matematic操作的結果小於零,將與「無符號」參數失敗。

0

其他方法是使用MySQL IF運算符。當這兩列都是BIGINT and Unsigned時,這幫助了我。

0

另一個可能的原因似乎是如何分配結果變量的類型。

例如。

mysql> select (total_balance_06 * 0.045/(1-(1/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH; 

失敗

ERROR 1690(22003):BIGINT UNSIGNED值超出範圍在 '(1 - ((1- /1.045)^ markovtbl_EUR_PDHterm_06)。)'

mysql> select (total_balance_06 * 0.045/(1.0-(1.0/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH; 

做一個會想到什麼(請注意,我只是將「1」改爲「1.0」)

菲利普

2

我有同樣的問題,它發生在一個JOIN和無法弄清楚是什麼繼續,最後它是ON子句中的拼寫錯誤,我放置了一個減號而不是等號。 可能是愚蠢的,但我只是沒有看到它約30分鐘,也許這可以幫助別人!

+1

雖然這不能直接回答這個問題,但它確實幫助了可能會遇到同樣問題的其他人(和我一樣)。畢竟,減號是在等號旁邊! ;)+1 – Sablefoste 2016-01-03 05:12:55

0

爲了概括規則,MySQL現在將拒絕從SIGNED操作數中減去UNSIGNED操作數。

例如:SELECT A - B;將失敗,如果A是SIGNED,而B是UNSIGNED。

解決方法:重新鍵入或使用CAST (B AS SIGNED),或者甚至交換(B-A)並相應地更改算法。