クライアントにはdefault-character-setを指定したいけどmysqlbinlogには怒られたくない

my.cnfには[group]というオプショングループが書けて、グループ毎に設定ができます。

オプショングループには特殊な[client]というのがあります。

[client]オプショングループは、すべてのクライアントプログラム(mysqldは除く)によって解読されます。これによって全てのクライアントに当てはまるオプションを指定することが可能になります。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.6 オプションファイルの使用

なので[client]default-character-set = utf8と書いておけば、(my.cnfを解釈する)全てのクライアントにdefault-character-setをセットすることが可能です。

ところがdefault-character-setを解さないクライアントの場合はエラーになってしまいます。例えばmysqlbinlogコマンドがそうです。

$ mysqlbinlog
mysqlbinlog: unknown variable 'default-character-set=utf8'

こういったときこそ loose- の出番です。

my.cnfに、

[client]
port                        = 3306
socket                      = /var/lib/mysql/mysql.sock
loose-default-character-set = utf8

と書いておけばOKです。


ググると今回のようなmysqlbinlogの問題の解決法としてmysqlbinlogに--no-defaultsを添えて実行する、というのが散見されますが、

  • my.cnfに書いた設定が全部無視される
  • いちいち指定するのがめんどい

ので、前置 loose- を使ったほうがいいんじゃないかと思います。