【问题标题】:BIGINT UNSIGNED VALUE IS out of range My SQLBIGINT UNSIGNED VALUE 超出范围 Mysql
【发布时间】:2012-07-26 18:28:54
【问题描述】:

我收到以下错误

#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

我一直盯着它有一段时间查询很长对不起。

spawns table - count game_moblist.spawn_id is 0 for all possible rows but 1 (我删除了一行来测试查询)

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

知道如何解决这个错误吗?

【问题讨论】:

标签: mysql


【解决方案1】:

在我的例子中,我减去了两个未签名的列,其中一些减法的结果是负数。将两列都设置为 SIGNED INT 为我解决了这个问题,但这只是一个临时修复

【讨论】:

    【解决方案2】:

    我不太明白为什么每个人都说未签名。 我在sql中有一个特殊的值,也报了这个错误。我通过将此值转换为十进制来做到这一点。

    cast(1000000000000000000 AS DECIMAL ( 35, 2 ))
    

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,如果我们的列有 0 值并且我们尝试使用 -1 值更新它,也会出现此错误。

      在我的情况下,如果 column1 已经具有值 0,则 MySQL 查询失败,即 column1 = 0

      例如:

      UPDATE `table1` SET `column1` = `column1` - 1 WHERE `column2` = XYZ
      

      这会报错

      BIGINT UNSIGNED value is out of range in ....

      解决这个问题

      UPDATE `table1`
      SET `column1` = (
          CASE WHEN `column1` < 1
          THEN 0
          ELSE (`column1` - 1)
      end)
      WHERE `column2` = 1
      LIMIT 1
      

      【讨论】:

        【解决方案4】:

        sql_mode 在 MySQL 客户端和 Adminer 中工作,但在 CodeIgniter 中却没有,这很重要。投射也没有帮助。

        一个简单的算术运算就可以了:

        错误

        id - id_ex*1000000000 = id_sm
        

        作品

        id_sm + id_ex*1000000000 = id
        

        【讨论】:

          【解决方案5】:

          为了概括规则,MySQL 现在将拒绝从已签名的操作数中减去未签名的操作数。

          示例:如果 A 已签名而 B 未签名,SELECT A - B; 将失败。

          解决方法:将 1.0 因子添加到带符号的操作数,使其隐式转换为 FLOAT,或使用 CAST (B AS SIGNED),甚至交换 (B - A) 并相应地更改算法。

          【讨论】:

          • 这对我有用。 A-B 没用,但 B-A 就像一个魅力!
          • 哦,伟大的宙斯,谢谢。当我对结果进行数学运算时,我一生都无法弄清楚为什么我的 case/when 语句导致我的查询中断。在它周围包裹“CAST(BLAH AS SIGNED)”效果很好。
          【解决方案6】:

          我遇到了同样的问题,它发生在 JOIN 上,无法弄清楚发生了什么,最后是 ON 子句中的错字,我在其中放置了减号而不是等号。 可能是愚蠢的,但我只是没有看到它大约 30 分钟,也许这可以帮助某人!!!

          【讨论】:

          • 虽然这不能直接回答这个问题,但它确实可以帮助其他可能遇到同样问题的人(就像我一样)。毕竟,减号就在等号旁边! ;) +1
          【解决方案7】:

          另一个可能的原因似乎是结果变量的类型是如何分配的。

          例如。

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

          菲利普

          【讨论】:

            【解决方案8】:

            另一种方法是使用MySQL IF 运算符。当两列都是 BIGINT and Unsigned 时,这对我有帮助。

            【讨论】:

              【解决方案9】:

              我实际上发现了我为什么要寻找解决方案的问题。如果你和我有同样的问题,请尝试禁用“无符号”参数。

              你的代码很可能在这里失败:

              (
              quantity - COUNT( game_moblist.spawn_id )
              )
              

              因为如果该 matematic 操作的结果小于零,它将因“无符号”参数而失败。

              【讨论】:

                【解决方案10】:

                请阅读“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)'
                

                要使操作在这种情况下成功,请将值转换为无符号;

                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

                【讨论】:

                • 链接中要注意的要点是:Subtraction between integer values, where one is of type UNSIGNED, produces an unsigned result by default.
                • 如果不是 100% 清楚:SELECT (CAST(1 AS UNSIGNED) - 2); 也会在范围的另一端触发错误。如果您使用无符号整数并且有包含减法的查询,请记住一些事情。如果任何结果变为否定,则查询失败。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-11-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-30
                相关资源
                最近更新 更多