MySQLで「Incorrect integer value: '' for column」エラーの対応方法
MySQLで「Incorrect integer value: '' for column `データベース名`.`テーブル名`.`カラム名` at row 1」というエラーが発生した。尚、古いサーバだとエラーは発生せず新しいサーバだと発生する。以下に原因と対応方法をメモ。
原因
int型のカラムに対して空('')を登録しようとしていたため発生した。
新旧サーバによるエラー発生有無に関して
SQLモードの問題となる。以下でSQLモードを確認できる。
SHOW VARIABLES LIKE 'sql_mode';
結果として旧サーバはSQLモードは空だったが、新サーバだと以下が設定されていた。
STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
この中の「STRICT_TRANS_TABLES」に引っかかっているっぽい。リファレンスによると以下の通り。
値を指定したとおりにトランザクションテーブルに挿入できない場合、ステートメントを中止します。 非トランザクションテーブルの場合、値が単一行ステートメントで発生するか、複数行ステートメントの先頭行で発生した場合、ステートメントを中止します。 詳細については、このセクションのあとの方で説明します。
尚、MySQL5系だとデフォルトでSTRICT_TRANS_TABLESは設定されておらず、8系だと設定されているみたい。そのため新旧サーバによるエラーの有無が発生した模様。
対応方法
数値をINSERTする
今回はcheckboxが一つだけ設置されており、チェックがあれば1、チェックがなければ0が入るというソースコードだった(STRICT_TRANS_TABLESが設定されていない場合は空指定で0が入っていた)。
この場合、SQL文を発行する際に「空文字だった場合は0を定義」もしくは「(int)等でキャスト」を行い、数値をINSERTする形に変更する。
SQLモードを変更
あまり良い方法ではなさそうだけど以下でSQLモードを変更する。
SET SESSION sql_mode = '';
所感
先日のPHP8系で「Uncaught TypeError: count(): Argument」エラーの対応でも思ったけど、変数の定義は気を付けていきたいところ。
参考サイト
関連記事
-
MySQLでdatetime型のカラムから秒は省いて検索する方法
MySQLでdatetime型のカラムに対して「2022-10-07 10:30 ...
-
MySQLで1対多というテーブル構造でデータ結合と条件検索する方法
MySQLで飲食店舗テーブルと休業日テーブルがあり、1店舗に対して複数行の休業日 ...
-
MySQLでREGEXPについて
SQL文にREGEXPというのを見てこれ何? となったのでメモ。 ■参考サイト ...
-
MySQLが起動も再起動もできない際の対応方法
サイトで障害が発生した。FTPやSSH接続は出来るけどサイト自体は表示されない。 ...
-
MySQLで「server has gone~」というエラーの対応方法
MySQLで「MySQL server has gone away」というエラー ...