my.cnf が見当たらない
sql_mode=only_full_group_by: 問題
とあるデータをバッチ処理にかけていた時のこと.突然のエラー.
Mysql2::Error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hoge.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by:
つまり:
’hoge.name’ というカラムが GROUP BY 句に入ってないのに SELECT しようとしてるよ.
これは sql_mode=only_full_group_by
の設定に反するから,集計関数 (aggregated function) と一緒に指定してね.
と言われている.
なるほど.じゃあその incompatibility とやらを葬ってやる. どうせそれっぽい名前の設定ファイルがあるんだろう?
ということで上記 MySQL の docs を見たら,my.cnf
なるファイルを発見.これだわ.
そしてそこにはこんなテーブルが.
罠かよ.どれに書いてあるんだその sql_mode=only_full_group_by
ってのは.
ありったけの my.cnf を
困ったら help
だ.ということで mysql --help
したら長すぎて読む気が失せた.
そこで,結果に grep
をパイプして my.cnf
を探す.
mysql --help | grep my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
だからどれだよ.
とはいえ大した量でもないので,片っ端から ll
して探す.
ll my.cnf ls: my.cnf: No such file or directory ll /etc/my.cnf ls: /etc/my.cnf: No such file or directory ll /etc/mysql/my.cnf ls: /etc/mysql/my.cnf: No such file or directory ll /usr/local/etc/my.cnf -rw-r--r-- 1 ks_y_sk admin 113B May 29 14:14 /usr/local/etc/my.cnf
発見.早速開いてみるものの,特にそれらしき記述がない.
# Default Homebrew MySQL server config [mysqld] # Only allow connections from localhost bind-address = 127.0.0.1
sql-mode を確認
こうなったら直接 MySQL 側から攻めよう.ということで:
mysql -uroot -e "SHOW VARIABLES LIKE 'sql_mode';" ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
やっと見つけたぞ許さん.こうしてやる.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
ちゃんと確認しておこう.
mysql -uroot -e "SHOW VARIABLES LIKE 'sql_mode';" STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
その後 MySQL を再起動したら,無事に期待通りの処理ができた.嬉しい.