Mysql BIGINT无符号值超出我的SQL范围

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

我得到以下错误

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
     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 ))