sql_mode does not work
MySQLのsql_mode
を設定する必要に迫られたので設定しようとしたらハマった…。MySQLのバージョンは5.6系です。OSはCentOS6系です。
手動で設定する方法
まずは手動で設定する方法。
現在設定されているsql_mode
を確認する方法は以下。
SELECT @@GLOBAL.sql_mode;
sql_mode
を手動で設定する方法は以下。
- 例として
NO_ENGINE_SUBSTITUTION
を指定する場合
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
ここまでは良い。ただし、この設定はオンメモリなのでmysqldを再起動したら失われます。
なので/etc/my.cnf
にsql_mode
を設定したかったのですが、ここでハマりました。sql_mode
の設定を書いてmysqldをrestartしても設定が反映されない…。
ハマリポイント1
MySQL5.6.27以前(Ubuntuのリポジトリの話ですが)ではsql_mode
が効かない問題があったらしい。
ハマリポイント2
どうにも/etc/my.cnf
に書いた設定が反映されないので、もしかして別の場所で設定が上書きされているのではないかと疑い雑にsudo find / -name "*my.cnf"
してみたところ、/usr/my.cnf
とやらが発掘されました。怪しい…。
中を見るとsql_node
の設定がありました。これが原因でした。
解決方法
/usr/my.cnf
のsql_mode
を修正することでmysqld restart後も設定が反映されました。
原因
範馬の血の如く様々なディレクトリに点在しているmy.cnf
の読み込み順は後勝ちになっており、/usr/my.cnf
は/etc/my.cnf
より後に読み込まれるので、/usr/my.cnf
のsql_mode
が反映されてしまっていました。
範馬の血的にも後から生まれた範馬刃牙の方がジャック・ハンマーより強いですね。
以下が参考になりました。
参考リンクにもあるように、/usr/bin/mysql_install_db
が/usr/my.cnf
を設置しているようです。mysql_install_db
はperlスクリプト(MySQL5.5ではシェルスクリプトらしい)になっており、# Distros might move files
以下の行で/usr/share/mysql/my-default.cnf
をコピーして作成しているようです。
/usr/my.cnf
はあくまでmysql_install_db
が設置しているファイルなので、rpm -ql mysql-community-server
コマンドでは発見できないところが曲者ですね…。
なおMySQL5.7のmysql_install_db
からは/usr/my.cnf
を作らなくなるそうです。 :D