MySQLのStrict Mode話 | Pimp my Code. @wataru420

Pimp my Code. @wataru420

My name is Wataru Fukunaga.

MySQLにはStrict Modeってのがあることを知ったのでメモ。
Strict ModeってのはSTRICT_TRANS_TABLES、STRICT_ALL_TABLESのどちらかが有効になってる状態の事。
設定方法はmy.cnfに書くんですが、そもそもStrict Modeって何って話からですね。

mysql at uppsala

Strict Modeとは


この設定はカラムに不正な値を入れた場合に警告じゃなくてエラーを返すというもの。
例えばcharのカラムに"1"という文字列を入れたい時、Strict Modeがoffの場合はダブルコーテーションを付けないとエラーになる。Strict Modeがoffだとうまいことやってくれる。

細かい挙動もオプションで制御可能。
例えばStrict Modeをonにした状態でDateのカラムに"2012-04-31"と入れるとエラーになる。
だけどALLOW_INVALID_DATESをonにすれば"0000-00-00"として登録される。

STRICT_TRANS_TABLESはInnodb等のトランザクションをサポートするエンジンのみのStrict Modeの設定で、これがデフォルトではonになっている。
ちなみにSTRICT_ALL_TABLESは全エンジン向けだが、トランザクションがないエンジンで使う場合はエラーが発生したタイミングでロールバックできないので注意が必要。

設定方法


設定方法はmy.cnfに書くのが一般的。
sql-mode=""オプションに書く。

その他、実行中に変更することもこんな感じで可能。
SET sql_mode = 'HIGH_NOT_PRECEDENCE';

現在設定されているモードを確認するには下記のコマンドを使う。
SELECT @@global.sql_mode;
SELECT @@session.sql_mode;

なんで気づいたか

テーブルをInnodbに変えたタイミングで下記のようなエラーが出たから。
Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data truncated for column 'hoge_colum' at row 133
view raw error This Gist brought to you by GitHub and Gist2Ameblo.

こういうの出たらStrict Modeが怪しいかもって事ですね。
またひとつ勉強になった。
詳しくはこちらを
http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html
Webエンジニアのための データベース技術[実践]入門 (Software Design plus)
Webエンジニアのための データベース技術[実践]入門 (Software Design plus)松信 嘉範

技術評論社 2012-03-09
売り上げランキング : 19998


Amazonで詳しく見る