BIGINT UNSIGNED VALUE超出范围我的SQL

时间:2012-07-28 05:42:41

标签: mysql

我收到以下错误

  

#1690 - BIGINT UNSIGNED值超出范围'{legendsspawnsquantity - 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_id0,但为1(我删除了一行来测试查询)

否则这些数据很长,与我认为的问题无关。

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

10 个答案:

答案 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)^ markovtbl_EUR_PDHterm_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 为我解决了这个问题,但这只是一个临时修复