2012-07-28 14 views
12

sto ottenendo il seguente erroreBIGINT valore senza segno è fuori portata My SQL

# 1690 - BIGINT valore senza segno è fuori portata in '(legendsspawnsquantity -.. tmp_field)'

Ecco la mia domanda

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 

sto fissando un mentre la query è lunga mi dispiace.

genera tavolo - conta game_moblist.spawn_id è 0 per tutte le possibili righe ma 1 (ho cancellato una riga per testare la query)

I dati in caso contrario è piuttosto lungo e irrilevante per la mia domanda credo

Qualsiasi idea come aggirare questo errore?

+0

molto simile a https://stackoverflow.com/questions/5605085/bigint-unsigned-value-is-out-of-range – qdinar

risposta

26

Leggere "Out-of-Range and Overflow Handling".
Dice:

partire da MySQL 5.5.5, di overflow durante numerici i risultati della valutazione di espressione in un errore. Ad esempio, il valore BIGINT firmato più grande è 9223372036854775807, pertanto l'espressione seguente produce un errore.

mysql> SELECT 9223372036854775807 + 1; 

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

Per consentire l'operazione per avere successo in questo caso, convertire il valore in unsigned;

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

Una modifica a parte della query, come indicato di seguito, risolverebbe il problema.

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

In caso contrario si può richiedere di cambiare il sql_mode sulle operazioni non firmati.

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; 

e quindi eseguire la query per ottenere l'output desiderato.

Vedi anche un post simile ha risposto su un forum here.

+0

Il punto principale da notare dal collegamento è: 'Sottrazione tra valori interi, dove uno è di tipo UNSIGNED, produce un risultato senza segno di default. – arun

2

Ho trovato questa domanda perché stavo cercando una soluzione. Se hai lo stesso problema che faccio, prova a disabilitare il parametro "unsigned".

E 'del tutto possibile che il codice non riesce qui:

(
quantity - COUNT(game_moblist.spawn_id) 
) 

perché se il risultato di tale operazione matematic è inferiore a zero fallirà con il parametro "unsigned".

0

Un altro modo è utilizzare l'operatore MySQL IF. Questo mi ha aiutato quando entrambe le colonne erano BIGINT and Unsigned.

0

Un'altra possibile causa sembra essere il modo in cui il tipo di variabile risultato è allocato.

es.

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

fallisce con

ERROR 1690 (22003): valore senza segno BIGINT è fuori portata in '(1 - ((1 /1,045)^markovtbl_EUR_PDHterm_06)..)'

mentre

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

fa quello che ci si aspetterebbe (notare che ho semplicemente sostituire "1" con "1.0")

Philippe

2

Ho avuto lo stesso problema, si è verificato su un join e non riusciva a capire cosa fosse succedendo, alla fine è stato battuto nella clausola ON in cui ho inserito un segno meno invece di un segno di uguale. Potrebbe essere stupido ma non l'ho visto per circa 30 minuti e forse questo potrebbe aiutare qualcuno !!!

+1

Sebbene questo non fornisca una risposta diretta alla domanda, aiuta gli altri che possono arrivare allo stesso problema (come ho fatto io). Dopo tutto, il segno meno è proprio accanto al segno di uguale! ;) +1 – Sablefoste

0

Per generalizzare la regola, MySQL ora rifiuterà di sottrarre un operando UNSIGNED da uno SIGNED.

Esempio: SELECT A - B; non riuscirà se A è FIRMATO mentre B è UNSIGNED.

Soluzioni alternative: ridigitare o utilizzare CAST (B AS SIGNED) o anche scambiare (B - A) e modificare di conseguenza l'algoritmo.

Problemi correlati