BIGINT UNSIGNED VALUE超出范围我的SQL

Sha*_*awn 14 mysql

我收到以下错误

#1690 - BIGINT UNSIGNED值超出范围在'( ..legends - )'spawnsquantitytmp_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
Run Code Online (Sandbox Code Playgroud)

我一直在盯着它查询很久我很抱歉.

spawns表 - count game_moblist.spawn_id0针对所有可能的行但是1(我删除了一行来测试查询)

否则数据很长,与我的想法无关

知道怎么解决这个错误吗?

Rav*_*ddy 30

请阅读" 超出范围和溢出处理 ".
它说:

从MySQL 5.5.5开始,数值表达式评估期间的溢出会导致错误.例如,最大的带符号BIGINT值为9223372036854775807,因此以下表达式会产生错误.

mysql> SELECT 9223372036854775807 + 1;

ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'
Run Code Online (Sandbox Code Playgroud)

要在这种情况下使操作成功,请将值转换为unsigned;

mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
|                       9223372036854775808 |
+-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如下所示,对查询的一部分进行更改可以解决问题.

( CAST( quantity AS SIGNED ) - COUNT( game_moblist.spawn_id ) ) AS quantity_to_spawn
Run Code Online (Sandbox Code Playgroud)

否则,您可能需要更改sql_modeon unsigned操作.

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
Run Code Online (Sandbox Code Playgroud)

然后运行您的查询以获得所需的输出.

另请参见类似的帖子回答了一个论坛,在这里.


Fab*_*adi 7

为了概括该规则,MySQL 现在将拒绝从 SIGNED 操作数中减去 UNSIGNED 操作数。

示例:SELECT A - B;如果 A 是 SIGNED 而 B 是 UNSIGNED,则会失败。

变通方法:将 1.0 因子添加到有符号操作数,因此它隐式地将其强制转换为 FLOAT,或者使用CAST (B AS SIGNED),甚至交换 (B - A) 并相应地更改算法。