ハツカネズミの恋

Lisp のもろもろ,おぼえがき

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 とやらを葬ってやる. どうせそれっぽい名前の設定ファイルがあるんだろう?

dev.mysql.com

ということで上記 MySQL の docs を見たら,my.cnf なるファイルを発見.これだわ.

そしてそこにはこんなテーブルが.

f:id:ksysk:20190613105003p:plain
*nix における設定ファイルの一覧

罠かよ.どれに書いてあるんだその 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 を再起動したら,無事に期待通りの処理ができた.嬉しい.

まとめと課題

  • sql_mode の定数について
    • 定数の種類と役割を理解する
    • MySQL のバージョンごとのデフォルト値を把握する
  • my.cnf について
    • MySQL のバージョンごとの記述内容を知る
    • 設定ファイル間の優先順位を知る