[MySQL] 厳格なSQLモードにする sql_mode='STRICT_ALL_TABLES'

Read More

MySQLにはSTRICT_ALL_TABLESなるsqlモードがある。


このモードにしておくと、INSERT文などのSQLを投げたとき、DB登録前に厳格な判定をしてくる。
値がおかしければエラー扱いにしてくれるので意図しない値が登録されるのを防ぐことができる。


もちろん、このようなものを指定しなくてもSQLに渡す値を事前にしっかりチェックしていれば問題はない。

しかしチェック漏れや想定外というものはありえることなので、お金を扱うようなものに関してはやはり設定しておいた方がよいと思われる。

例えばDBのINTの指定サイズを超えた値を登録しようとしたときは、これを指定しないとカットされた値が登録されるが、STRICT_ALL_TABLESにしているとキチンとエラーを返してくれる。


ただし、nullや空文字の扱いも厳格になるので今までOKだったSQL文がダメになったりすることもある。
# デフォルト値を指定してない場合などに起こりやすい




--
■sql_mode='STRICT_ALL_TABLES'を設定する
MySQLの設定ファイル(my.cnf、或いはmy.ini)を開く。
パスは自分の環境だと、
C:/xampp1.7.7/mysql/bin/my.ini
となる。


[mysqld] セクションに以下の記述を追加してmysqlを再起動する。
sql_mode='STRICT_ALL_TABLES'








--
■sql_modeを確認する
SQL文にて以下を実行するとsql_mode設定の内容が確認できる。
SHOW VARIABLES LIKE 'sql_mode';







--
おまけ:
sqlモードをSTRICT_ALL_TABLESにすると、SQLエディタでレコードを変更した時にエラーをはくようになった。


テーブルを確認するとuser_agentというカラム名で、varchar(3072)、NOT NULL、デフォルト値はなし、が設定されていた。
これは自分が設定したものではない。


うーん…


NOT NULLの時はデフォルト値を’’(空文字)に設定しといてくれないかなー。

あるいはデフォルト値を指定してないならNOT NULLを止めてくれないかな。


個人的にはNOT NULLって本当に必須項目だけに使うものだと思うんだけど。
STRICT_ALL_TABLESとか関係なく、こんなどーでもいい値(とれるかとれないかわからんよーな値)はNULLを許可にしてくれないと困る。