MySQL5.6のSQLモード

ついに出ましたね、MySQL5.6!

my.cnfの位置が/usr/my.cnfに変わったとか標準動作がinnodb_per_tableになったとか色々ありますが、とりあえずデフォルトのmy.cnf内に

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

という記述があって、詳細はこちらを見ていただくとして、今まではsql_mode=TRADITIONALだったのですが、このまま起動するとSTRICT_TRANS_TABLESモードで起動してしまいます。

TRADITIONALはカラムレングスよりも長い文字列のレコードがインサートされた場合、カラムに入らない部分を切り捨てて格納し、エラーメッセージを返すんですが、STRICT_TRANS_TABLESだとインサートエラーを返します。

WEBアプリでレングスチェックをしているのでMySQL側でチェックする必要ないよ、という人はTRADITIONALモードに変更しましょう。

TRADITIONALモードで起動した場合、余計チェックが厳しくなりました><
5.6はTRADITIONALモードも変更が入ってるらしい。。。

mysql> select @@global.sql_mode;

  1. ------------------------------------------------------------------------------------------------------------------------------------------------------+
@@global.sql_mode
  1. ------------------------------------------------------------------------------------------------------------------------------------------------------+
STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. ------------------------------------------------------------------------------------------------------------------------------------------------------+

5.5時代と同じように使う場合はsql_mode自体をコメントアウトして起動しましょう