Подтвердить что ты не робот

BIGINT UNSIGNED VALUE Out вне диапазона My SQL

Я получаю следующую ошибку

# 1690 - Значение BIGINT UNSIGNED вне диапазона в '(legends. spawns. quantity - 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

Я смотрел на него, пока запрос длинный. Мне жаль.

spawns table - count game_moblist.spawn_id - 0 для всех возможных строк, но 1 (я удалил строку для проверки запроса)

Данные в противном случае довольно длинны и не имеют отношения к моему вопросу, я думаю,

Любая идея, как обойти эту ошибку?

4b9b3361

Ответ 1

Пожалуйста, прочтите " Обработка вне диапазона и переполнения.
В нем говорится:

Как и в случае MySQL 5.5.5, переполнение во время вычисления числового выражения приводит к ошибке. Например, наибольшее подписанное значение BIGINT равно 9223372036854775807, поэтому следующее выражение вызывает ошибку.

mysql> SELECT 9223372036854775807 + 1;

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

Чтобы активировать операцию в этом случае, преобразуйте значение в unsigned;

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';

а затем запустите запрос, чтобы получить желаемый результат.

См. также аналогичную публикацию на форуме здесь.

Ответ 2

Я действительно нашел этот вопрос, почему я искал решение. Если у вас есть такая же проблема, как и я, попробуйте отключить параметр "unsigned".

Вполне возможно, что ваш код не работает здесь:

(
quantity - COUNT( game_moblist.spawn_id )
)

потому что если результат этой математической операции меньше нуля, он будет терпеть неудачу с параметром "unsigned".

Ответ 3

У меня была та же проблема, она произошла в JOIN и не могла понять, что происходит, в конце концов, это была опечатка в предложении ON, где я помещал знак минус вместо знака равенства. Может быть, это глупо, но я просто не видел его около 30 минут, и, возможно, это может помочь кому-то!!!

Ответ 4

Дополнительным способом является использование MySQL IF. Это помогло мне, когда обе колонки были BIGINT and Unsigned.

Ответ 5

Другая возможная причина, по-видимому, заключается в том, как распределяется тип переменной результата.

например.

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

не работает с

ОШИБКА 1690 (22003): значение BIGINT UNSIGNED находится за пределами допустимого диапазона в '(1 - ((1 /1.045) ^ markov. tbl_EUR_PDH. term_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" )

Филипп

Ответ 6

Чтобы обобщить правило, MySQL теперь откажется вычесть операнд UNSIGNED из SIGNED.

Пример: SELECT A - B; выйдет из строя, если A ПОДПИСАНО, а B НЕ ПОДКЛЮЧЕН.

Обходные пути: повторите или используйте CAST (B AS SIGNED), или даже замените (B - A) и соответствующим образом измените алгоритм.