Mysql BIGINT无符号值超出我的SQL范围
我得到以下错误 1690-BIGINT无符号值超出“legends.spawns.quantity-tmp_字段”中的范围 这是我的问题Mysql BIGINT无符号值超出我的SQL范围,mysql,Mysql,我得到以下错误 1690-BIGINT无符号值超出“legends.spawns.quantity-tmp_字段”中的范围 这是我的问题 SELECT drops.common, drops.uncommon, drops.rare, drops.legendary, spawns . * , ( quantity - COUNT( game_moblist.spawn_id ) ) AS quantity_to_spawn , mobs . * FROM spawns
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我删除了一行以测试查询
我认为这些数据相当长,与我的问题无关
你知道如何避免这个错误吗?请阅读。
它说:
从MySQL 5.5.5开始,数值表达式求值期间的溢出会导致错误。例如,最大的有符号BIGINT值是9223372036854775807,因此下面的表达式产生错误
要使操作在这种情况下成功,请将该值转换为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_模式
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
然后运行查询以获得所需的输出
另请参阅论坛上回答的类似帖子。我实际上发现了我为什么要寻找解决方案的问题。如果您和我有相同的问题,请尝试禁用无符号参数 很可能您的代码在此失败:
(
quantity - COUNT( game_moblist.spawn_id )
)
因为若该matematic操作的结果小于零,它将使用无符号参数失败。另一种方法是使用运算符。当两列都是BIGINT和Unsigned时,这对我很有帮助。另一个可能的原因似乎是如何分配结果变量的类型 例如 失败于 错误1690 22003:BIGINT无符号值超出了“1-1”中的范围 /1.045 ^马尔科夫.待定欧元PDH.期限' 鉴于
mysql> select (total_balance_06 * 0.045/(1.0-(1.0/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;
人们是否会注意到我只是用1.0替换了1
Philippe我也遇到了同样的问题,它发生在一个连接上,无法理解发生了什么,最后是on子句中的拼写错误,我在其中放置了减号而不是等号。
可能很愚蠢,但我只是在大约30分钟内没有看到它,也许这可以帮助某人 为了推广该规则,MySQL现在将拒绝从有符号操作数中减去无符号操作数 示例:选择A-B;如果A已签名,而B未签名,则将失败 解决方法:向有符号操作数添加1.0因子,这样它会隐式地将其强制转换为浮点,或者使用强制转换B作为有符号,甚至交换B-A并相应地更改算法。sql\u模式在MySQL客户端和管理员中起作用,但在CodeIgniter中不起作用,在后者中它起作用。选角也没用 一个简单的算术运算就成功了: 错误 作品
我也有类似的问题,如果我们的列有0值,并且我们尝试用-1值更新它,那么这个错误也会出现 在我的例子中,如果column1已经具有值0,即column1=0,则MySQL查询将失败 例如: 更新`table1`集`column1`=`column1`-1其中`column2`=XYZ 这是一个错误 BIGINT无符号值超出了…中的范围 为了解决这个问题 更新`表1` 设置'column1`= “column1”小于1时的大小写 然后0 ELSE`column1`-1 终止 其中'column2`=1 限制1
我不太明白为什么每个人都说未签名。 我在sql中有一个特殊值,并报告了此错误。我是通过将这个值转换成十进制来实现的
cast(1000000000000000000 AS DECIMAL ( 35, 2 ))
链接中需要注意的要点是:整数值之间的减法,其中一个类型为UNSIGNED,默认情况下会生成一个无符号结果;也会在范围的另一端触发错误。如果您使用无符号整数,并且有包含值减法的查询,请记住这一点。如果任何结果为否定,查询将失败。虽然这不能直接回答问题,但它确实帮助了其他可能遇到与我相同问题的人。毕竟,减号就在等号旁边+1与此非常相似,这对我很有用。A-B不起作用,但B-A起作用了!
mysql> select (total_balance_06 * 0.045/(1.0-(1.0/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;
id - id_ex*1000000000 = id_sm
id_sm + id_ex*1000000000 = id
cast(1000000000000000000 AS DECIMAL ( 35, 2 ))