26

次のエラーが表示されます

#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 テーブル - カウントgame_moblist.spawn_id01 を除くすべての可能な行です (クエリをテストするために行を削除しました)

それ以外の場合、データは非常に長く、私の質問とは無関係だと思います

このエラーを回避する方法はありますか?

4

10 に答える 10

39

「範囲外およびオーバーフロー処理」をお読みください。
それは言います:

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';

次に、クエリを実行して目的の出力を取得します。

こちらのフォーラムで回答された同様の投稿も参照してください。

于 2012-07-28T19:54:03.307 に答える
8

ルールを一般化するために、MySQL は UNSIGNED オペランドを SIGNED オペランドから減算することを拒否するようになりました。

例 : SELECT A - B;A が SIGNED で B が UNSIGNED の場合は失敗します。

回避策: 符号付きオペランドに係数 1.0 を追加して、暗黙的に FLOAT にキャストするか、 を使用するCAST (B AS SIGNED)か、(B - A) を交換して、それに応じてアルゴリズムを変更します。

于 2017-01-17T03:13:47.257 に答える
3

私は同じ問題を抱えていました.JOINで発生し、何が起こっているのか理解できませんでした.最終的には、等号の代わりにマイナス記号を配置したON句のタイプミスでした. ばかげているかもしれませんが、私は約30分間それを見なかったので、これは誰かを助けるかもしれません!!!

于 2015-03-08T10:17:12.450 に答える
2

なぜ解決策を探していたのか、実際にその質問を見つけました。私と同じ問題がある場合は、「符号なし」パラメーターを無効にしてみてください。

コードがここで失敗する可能性は十分にあります。

(
quantity - COUNT( game_moblist.spawn_id )
)

その数学演算の結果がゼロ未満の場合、「符号なし」パラメーターで失敗するためです。

于 2013-02-07T16:58:04.920 に答える
1

追加の方法は、MySQL IF演算子を使用することです。これは、両方の列がBIGINT and Unsigned.

于 2013-03-25T16:06:57.080 に答える
1

同様の問題がありました。このエラーは、列に0値があり、値で更新しようとした場合にも発生し-1ます。

私の場合、MySQL クエリは、column1既に値0を持っている場合に失敗していました。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
于 2019-02-09T18:54:41.607 に答える
0

別の考えられる原因は、結果変数の型がどのように割り当てられているかです。

例えば。

mysql> select (total_balance_06 * 0.045/(1-(1/1.045)^term_06) + unsec_instalments)/income from tbl_EUR_PDH;

で失敗します

エラー 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」に置き換えるだけです)。

フィリップ

于 2013-12-11T12:56:50.860 に答える