今日はMySQLを扱う上で注意しなければならない仕様について説明します。
例えば以下のようなユーザーテーブルがあったとします。
このテーブルにレコードを追加しますが、
間違えてtinyint型である「age」に文字列を設定してしまいました。
クエリは正常に実行されました。
しかしよく見ると 1 warning と出ています。
テーブルの中はどうなっているかというと・・・
ageには0が入っています。
「入れようとしたけど無理だったからtinyint型の初期値である0を入れとくよ」と
MySQLが勝手にやっていることです。
これはバグではなく仕様です。
また、ageに '20歳' と設定すると文字列部分が切り捨てられて 20 が入ります。
さらに、tinyint型の最大値は 127 ですが、
これを超える値を設定した場合は 127 が入ります。
つまり、データ型に対して無効な値を入力してもエラーにはなりません。
もう一度言いますが、バグではなく仕様です。
少し話が反れますが、以前現場でこんなことがありました。
クエリ実行により運用データを投入したが、
データに不備があり、本番で障害発生という事象です。
データ投入時に不備に気付けていれば、
被害は最小限に防げたものの、それが出来ませんでした。
原因はまさに今回ご紹介した内容です。
さて、MySQLにはsql_modeという設定があります。
これを利用することで、警告で出ていたクエリをエラーにすることが出来ます。
数が多いときなどはこれを利用して、開発環境などで実施して確認すればOKですね!
詳しくは以下をどうぞ
https://dev.mysql.com/doc/refman/5.6/ja/constraint-invalid-data.html
ではまた!