我收到以下错误
#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_id是0针对所有可能的行但是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)
然后运行您的查询以获得所需的输出.
另请参见类似的帖子回答了一个论坛,在这里.
为了概括该规则,MySQL 现在将拒绝从 SIGNED 操作数中减去 UNSIGNED 操作数。
示例:SELECT A - B;如果 A 是 SIGNED 而 B 是 UNSIGNED,则会失败。
变通方法:将 1.0 因子添加到有符号操作数,因此它隐式地将其强制转换为 FLOAT,或者使用CAST (B AS SIGNED),甚至交换 (B - A) 并相应地更改算法。