勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLで「Incorrect integer value: '' for column」エラーの対応方法

  MySQL データベース

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」エラーの対応でも思ったけど、変数の定義は気を付けていきたいところ。

 

参考サイト

https://server-recipe.com/3570/

 - MySQL データベース

  関連記事

MySQLで「doesn't have a default value」エラーの対処
MySQLで「doesn't have a default value」エラーの対処

MySQLでINSERT時に「Field 'カラム名' doesn't have ...

MySQLでデータがあれば上書き、無ければ挿入する
MySQLでデータがあれば上書き、無ければ挿入する

既存のソースを編集時に「REPLACE INTO~~」 という見たことの無いSQ ...

MySQLで特定カラムの<br>タグを改行コードに一括置換させる方法
MySQLで特定カラムの
タグを改行コードに一括置換させる方法

MySQLで特定カラムの<br>タグを改行コードに一括置換したかった ...

MySQLでwhere句を使ってカラム指定でデータをコピーする方法
MySQLでwhere句を使ってカラム指定でデータをコピーする方法

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...

MySQLでランダムにデータを取得しつつページング機能も実装する方法
MySQLでランダムにデータを取得しつつページング機能も実装する方法

MySQLからデータを持ってくる際にランダムな表示を行ってほしいと言われた。ただ ...