web-dev-qa-db-ja.com

BIGINT UNSIGNED値が範囲外です

エラーが発生しています

BIGINT UNSIGNED値が範囲外です '(1301980250-mydb.news_articles.date) '

クエリを実行するとき

SELECT *, ((1 / log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight;

ORDER BY条件を削除すると、エラーも削除されます。どうすれば修正できますか?

更新: 日付フィールドにはUNIXタイムスタンプが含まれます(例:1298944082)。 MySQLを5.0.xから5.5.xにアップグレードした後にエラーが表示され始めました

助けてください?

37
Joyce Babu

私は最近これに遭遇し、UNSIGNED intを単にSIGNEDとしてキャストする最も合理的なソリューションを見つけました。

 SELECT *, ((1 / log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight
74
ab5tract

この問題は、wallykが示唆するように、符号なし整数オーバーフローが原因でした。によって解決できます

  1. SELECT *, ((1 / log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight;を使用(これは私のために働いた) `
  2. My.cnfのsql_modeパラメーターをNO_UNSIGNED_SUBTRACTIONに変更します(これはチェックしていません)
16
Joyce Babu

これは、データのヌルが原因である場合があります。

IFNULLを使用してデフォルト値を設定します(おそらくタイムスタンプの0はデフォルトとして不適切であり、実際にはこの場合、WHERE句で日付を除外してNULLを設定した方がよい場合があります)

SELECT (123456 - IFNULL(date, 0)) AS leVar

4
Ian Chadwick

2011-04-04 22:10:50 PDT(2011-04-05 05:10:50 utc)以降の日付値は、式が負になるため、このエラーが発生します。

4
wallyk

多分あなたはcastを使用することができます

SELECT *, ((1 / log(1301980250 - cast(date AS SIGNED))) * 175) as weight FROM news_articles ORDER BY weight;

2
fairjm

Log()関数が厳密に正の引数に対してのみ定義されていることについては誰も言及していません。 log()内で減算を使用する場合は、これに注意してください。

元の質問については、解決の重要な要素は、日付列のデータ型を指定することでした。 UNSIGNEDの場合、MySQLは気に入らないかもしれません。

ルールは、MySQLの算術アルゴリズムが貧弱であり、AがB AND B> Aよりも少ないバイトでコーディングされている場合、オペランドBを別のAから減算する方法(= do A-B)を把握できないことです。

e.g。 A = 12でSMALLINT、B = 13 AS INTの場合、MySQLはA-Bが何であるかを把握できません(-1!)

MySQLコンテンツを作成するには、オペランドAのコーディング長を拡張するだけです。 CAST()を使用するか、Aに10進数を掛けます。

ご覧のように、MySQLの算術演算で符号を処理する問題よりも、オーバーフローの問題ではありません。マイクロプロセッサ、またはそれ以上の人間は、この種の算術演算を実行しても問題ありません...

CAST()を使用する方法があります。簡単に言えば、オペランドAに1を乗算することで暗黙的なキャストを引き起こします)(= 1.0)

例えば

1.*A - B
2
Fabien Haddadi

結果が0未満になったフィールドで更新を行うと、この問題に出くわしました。

解決策:更新によって署名されていないフィールドの結果が0未満になることを確認します。

0
kojow7