Incorrect integer value: for column xxxx a t row 1 に対処
MYSQLは汎用的なデータベースとして、大抵のレンタルサーバーに導入されており、設定すればPHP等のプログラムから呼び出しができます。
いままで使ったことのないサーバーで、データを追加したところタイトルのような「Incorrect integer value:」というエラーが発生しました。
色々調べて対処できたので、忘備録として記録します。
そもそも何エラー?
「Incorrect integer value:」をググってみると、かなりたくさん出てきました。
要約すると、「追加しようとしているカラムの型式と異なる値で追加しようとしています」というようなエラーでした。
どういうことかというと、「例えばMYSQLテーブルに宣言したカラムの型式が数字専門の指定であれば、数字以外の文字が入っていますよ」というような、予定外の値が入っている場合に発生するエラーということです。
ただ、テスト環境で同じプログラムを動作させてもエラーはでず、該当サーバーでのみ発生するエラーでした。
サーバー側のMYSQLの設定により発生する
そもそもこのエラーは、MYSQLにカラムの形式の厳密なチェックを設定しているかどうかで発生するエラーのようでした。
事実、同じプログラムなのにテスト環境でエラーが発生しなかったのは、テスト環境にはこの設定がされていませんでした。
確かに、ググルとMYSQLのバージョンがかなり古くても、最新でも設定がしてあれば発生するエラーです。MYSQLのバージョンに関連するエラーではなく、MYSQLの設定によるエラーで間違いないようです。
ただ、レンタルサーバーのmy.ini 等は変更できないので、プログラム側の修正で対処することにしました。
要は正しい値をカラムに設定すればOKなのです
今回はMYSQLへのデータ追加でエラーが発生しましたが、必ず発生するわけではなく、追加ができるデータもありました。
違いを調べたところ、特定テーブルにデータを追加した時だけエラーが発生していました。
エラーログから、どのカラムでエラーが発生しているか調べたところ、以下のカラムがエラーとなっていました。
カラムの宣言が、smallint unsigned のもの
ただ、エラーが発生しないテーブルにも同様の宣言がありましたが、なぜ特定テーブルのみエラーが発生するのか、わかりませんでした。
なので、仮説を立ててみました。
エラーの発生しない項目は、初期値として必ず何かしらの数字が入っていましたが、エラーの発生するカラムは、初期値はNULLで、NULLまま追加されることもあるテーブルでした。
もしかして、smallintのカラムをNULLで追加したらエラーになるのではないか?
一応そのカラムは、NULL可、初期値NULLを宣言しています。
プログラム上でも、初期値としてNULLを設定しています。
プログラム上で初期値をNULLとしていたところを、数字の0に変更してみました。
NULLと0の違いはあるのか?という疑問もありますが、精密にはNULLは何もなし、0は数字のゼロが設置されているという違いがあるようです。
おそるおそる初期値「0」で試してみたところ、エラーが発生しなくなりました。
MYSQLの型式チェックが厳しい設定の分、NULLとゼロを厳しくチェックしていたようです。
今回はプログラム側の修正のみで対応ができました。