2012-07-28 21 views
12

Estoy recibiendo el siguiente errorBIGINT valor sin signo está fuera del rango My SQL

# 1690 - BIGINT valor sin signo está fuera de rango en '(legendsspawnsquantity -.. tmp_field)'

Aquí es mi consulta

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 

he estado mirando un rato la consulta es mucho lo siento.

desova mesa - recuento game_moblist.spawn_id es 0 para todas las filas posibles, pero 1 (He eliminado una fila para probar la consulta)

Los datos de lo contrario es bastante larga e irrelevante a mi pregunta creo

Cualquier idea cómo evitar este error?

+0

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

Respuesta

26

Por favor, lea "Out-of-Range and Overflow Handling".
Dice:

A partir de MySQL 5.5.5, durante desbordamiento resultados de la evaluación expresión numérica en un error. Por ejemplo, el mayor valor de BIGINT firmado es 9223372036854775807, por lo que la siguiente expresión produce un error.

mysql> SELECT 9223372036854775807 + 1; 

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

Para habilitar la operación para tener éxito en este caso, convertir el valor de signo;

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

Un cambio en una parte de su consulta, como se indica a continuación, resolvería el problema.

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

De lo contrario es posible que necesite cambiar el sql_mode en operaciones sin firmar.

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; 

y luego ejecute su consulta para obtener la salida deseada.

Véase también una fijación similares respondió en un foro here.

+0

El punto principal a tener en cuenta en el enlace es: 'Resta entre valores enteros, donde uno es del tipo UNSIGNED, produce un resultado sin firmar por defecto. – arun

2

Realmente encontré esa pregunta por qué estaba buscando una solución. Si tiene el mismo problema que yo, intente deshabilitar el parámetro "sin firmar".

Es muy posible que su código falla aquí:

(
quantity - COUNT(game_moblist.spawn_id) 
) 

porque si el resultado de esta operación matematic es menor que cero se producirá un error con el parámetro "sin firmar".

0

Otra forma es utilizar el operador MySQL IF. Esto me ayudó cuando ambas columnas eran BIGINT and Unsigned.

0

Otra posible causa parece ser cómo se asigna el tipo de variable de resultado.

por ejemplo.

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

falla con

ERROR 1690 (22003): valor sin signo BIGINT está fuera del intervalo en '(1 - ((1 /1,045)^markovtbl_EUR_PDHterm_06)..)'

mientras que

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

hace lo que uno esperaría (tenga en cuenta que simplemente reemplazar "1" por "1.0")

Philippe

2

que tenía el mismo problema, que se produjo en un JOIN y no podía entender lo que estaba pasando, al final fue un error tipográfico en la cláusula ON donde coloqué un signo menos en lugar de un signo igual. Puede ser estúpido, pero no lo vi durante unos 30 minutos y tal vez esto podría ayudar a alguien.

+1

Si bien esto no proporciona una respuesta directa a la pregunta, ayuda a otros que pueden llegar al mismo problema (como yo lo hice). ¡Después de todo, el signo Menos está justo al lado del signo igual! ;) +1 – Sablefoste

0

Para generalizar la regla, MySQL ahora se negará a restar un operando UNSIGNED de uno FIRMADO.

Ejemplo: SELECT A - B; fallará si A está FIRMADO mientras que B NO ESTÁ FIRMADO.

Soluciones: vuelva a escribir, o use CAST (B AS SIGNED), o incluso cambie (B - A) y cambie el algoritmo en consecuencia.

Cuestiones relacionadas