データ型に対して無効な値の扱い | 株式会社スタイラジーの「居心地の良い」ブログ

株式会社スタイラジーの「居心地の良い」ブログ

会社の事や仕事の事、
その他イベントなど、
色々な話題を思うがままに
株式会社スタイラジー社員
の日常を紹介します。

株式会社スタイラジーの
「居心地の良い」ブログ、
2008年1月7日スタート!

今日は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

 

ではまた!