2017-08-29 9 views
0

クライアントをMySQL 5.4から5.7にアップグレードすると、「BIGINT UNSIGNEDの値が範囲外です...」というエラーが発生しました。 my.cnfを編集してsql_mode = "NO_UNSIGNED_SUBTRACTION"を設定し、実際にそのモードを使用していることを確認するためにSHOW VARIABLESを使用しました。それは、unsigned int型の列は、私は新しいsql_modeの元に戻すだろうと思ったので、私は理由を理解していない...SQLモードはNO_UNSIGNED_SUBTRACTIONですが、範囲外のエラーが発生する

UPDATE table SET inventory = inventory - 1 

(BTW在庫が2である)同じエラーがスローされ、今日のアプリケーションで、最初の問題を解決したがなかったですビヘイビアが5.5になる前に?単純な算術演算を行うために私の文ですべてをキャストしたくないので、論理的な解決策は、プライマリの自動インクリメントキーを除いて、すべての符号なしint colを符号付き整数に変換することだけです。

これは、範囲外のエラーをエスケープするための最良のソリューションですか?

答えて

0

私はもう少し掘り下げて私の答えを見つけ出し、今後これに取り組んでいる人にはここで共有したいと考えていました。 SQLモードNO_UNSIGNED_SUBTRACTIONが実際に動作していて、このテーブル/カラムに対して復帰していませんでした。要するに、そのテーブルにトリガーがあったということです。私は、Davi Arnautによるユーザーのコメントに記載されているように、トリガーとプリペアドステートメントが作成時に使用されていたSQLモードを使用していることを2009年のやや関連したMySQL bug report ...ああ!だから、私はトリガーを再定義し、すべてが期待どおりに機能します。

関連する問題