我收到以下错误
#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
我一直盯着它查询很长一段时间我很抱歉。
生成表 - 对于所有可能的行,game_moblist.spawn_id
为0
,但为1(我删除了一行来测试查询)
否则这些数据很长,与我认为的问题无关。
知道怎么解决这个错误吗?
答案 0 :(得分:27)
请阅读“Out-of-Range and Overflow Handling” 它说:
从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';
然后运行查询以获得所需的输出。
另请参阅论坛 here 上发布的类似帖子。
答案 1 :(得分:2)
我实际上发现了为什么我在寻找解决方案的问题。如果您遇到与我相同的问题,请尝试禁用“unsigned”参数。
你的代码很可能在这里失败:
(
quantity - COUNT( game_moblist.spawn_id )
)
因为如果该材料操作的结果小于零,它将失败,并带有“unsigned”参数。
答案 2 :(得分:2)
我遇到了同样的问题,它发生在JOIN上并且无法弄清楚发生了什么,最后在ON子句中我输了一个减号而不是等号的拼写错误。 可能是愚蠢但我只是没有看到它约30分钟,也许这可以帮助别人!!!
答案 3 :(得分:1)
其他方法是使用MySQL IF运算符。当两列都是BIGINT and Unsigned
时,这对我有帮助。
答案 4 :(得分:1)
我不太明白为什么每个人都说未签名。 我在sql中有一个特殊值,并且还报告了此错误。我通过将该值转换为十进制来实现的。
InvalidIndexError Traceback (most recent call last)
<ipython-input-17-5d3803c5ef90> in <module>
52
53
---> 54 df = pd.DataFrame({'DE_TIME': DE_row,'FE_TIME': FE_row, 'BA_TIME': BA_row})
55
56 #df.to_csv('CWRU_Dataset.csv')
~\Anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
390 dtype=dtype, copy=copy)
391 elif isinstance(data, dict):
--> 392 mgr = init_dict(data, index, columns, dtype=dtype)
393 elif isinstance(data, ma.MaskedArray):
394 import numpy.ma.mrecords as mrecords
~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py in init_dict(data, index, columns, dtype)
210 arrays = [data[k] for k in keys]
211
--> 212 return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
213
214
~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py in arrays_to_mgr(arrays, arr_names, index, columns, dtype)
49 # figure out the index, if necessary
50 if index is None:
---> 51 index = extract_index(arrays)
52 else:
53 index = ensure_index(index)
~\Anaconda3\lib\site-packages\pandas\core\internals\construction.py in extract_index(data)
310
311 if have_series or have_dicts:
--> 312 index = _union_indexes(indexes)
313
314 if have_raw_arrays:
~\Anaconda3\lib\site-packages\pandas\core\indexes\api.py in _union_indexes(indexes, sort)
181 else:
182 for other in indexes[1:]:
--> 183 result = result.union(other)
184 return result
185 elif kind == 'array':
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in union(self, other, sort)
2330 result.extend([x for x in rvals if x not in value_set])
2331 else:
-> 2332 indexer = self.get_indexer(other)
2333 indexer, = (indexer == -1).nonzero()
2334
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_indexer(self, target, method, limit, tolerance)
2738
2739 if not self.is_unique:
-> 2740 raise InvalidIndexError('Reindexing only valid with uniquely'
2741 ' valued Index objects')
2742
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
答案 5 :(得分:0)
另一个可能的原因似乎是如何分配结果变量的类型。
例如
mysql> select (total_balance_06 * 0.045/(1-(1/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;
失败
ERROR 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 :(得分:0)
为了概括规则,MySQL现在拒绝从SIGNED操作数中减去UNSIGNED操作数。
示例:如果A是SIGNED而B是UNSIGNED,则SELECT A - B;
将失败。
变通方法:将1.0因子添加到带符号的操作数,因此它会隐式地将其强制转换为FLOAT,或者使用CAST (B AS SIGNED)
,甚至交换(B - A)并相应地更改算法。
答案 7 :(得分:0)
sql_mode
在MySQL客户端和Adminer中工作,但在CodeIgniter中没有,它在那里很重要。施法也没有帮助。
一个简单的算术运算就可以了:
id - id_ex*1000000000 = id_sm
id_sm + id_ex*1000000000 = id
答案 8 :(得分:0)
我有类似的问题,如果我们的列的值为0,并且尝试将其更新为-1,也会出现此错误。在我的情况下,如果mycolum已经具有值0,即column1 = 0
,则MySql查询失败。例如
Update table1 set column1=column1-1 where column2=XYZ
这给了错误
BIGINT UNSIGNED值超出....
为了解决这个问题
UPDATE table1 SET `column1`=(case when column1 < 1 then 0 else (column1 - 1) end) WHERE column2=1 LIMIT 1
答案 9 :(得分:0)
在我的例子中,我减去了两列 UNSIGNED 并且一些减法的结果是负数。将两列都设置为 SIGNED INT 为我解决了这个问题,但这只是一个临时修复