mysqlの設定は、環境つくるときにちょいちょいやるのですが、いつもなんとなく文字コードの設定はやっておりました。
もう、なんとなくやるのは嫌だ!と思って深追いしたメモです。
まず違いがわかってない
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
こうなってたときに、よし、
- character_set_database
- character_set_server
をutf8に変更しようっとなります。
でも、そもそも、この違いがわからなくて調べました。
ここにありました。
http://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_character_set_server
character_set_database
デフォルトデータベースで使用される文字セット。デフォルトのデータベースが変更されるたびに、サーバーはこの変数を設定します。デフォルトデータベースが存在しない場合、変数は character_set_server と同じ値になります。
やばい、デフォルトデータベース..ってなんだよ。となりましたが、これは、USEで選択されているデータベースを指すようです。
character_set_server
サーバーのデフォルト文字セット。
なるほどー。。。
わかった気がするんですけど、うまく言語化できないのですが、とにかく
- character_set_server
をちゃんと設定すればよいということです。
(すでに文字化けを起こしちゃっている場合は、character_set_databaseがlatin1とかになっていたりします。その場合はcharacter_set_serverをutf8にしたところで手遅れで、character_set_databaseを修正する必要があるのでdatabase作り直しとかだと思います。)
なので、やることは[mysqld]に追記
[mysqld]
character-set-server = utf8
とすれば、上の2つのlatin1は消えてutf8になります。
[mysqld]ってなんだよ、って気持ちにはなりますので、この辺をみておきます。
https://dev.mysql.com/doc/refman/5.6/ja/option-files.html
以上です。
my.cnfの全容は分かっておりませんが、少しだけ仲良くなれた気がします。