cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

MySQLのエンコーディングをUTF-8にする

問題

新しいUbuntuで作業しだしたら、文字コード周りでエラーが発生した。
http://blog.pasberth.com/2011/10/django-mysql-incorrect-string-value.html
と同じようなエラーメッセージが出ていたので文字コード周りで間違い無いだろう

やること

MySQLのエンコーディングをUTF-8にする

環境

MySQL5.5(Ubuntu12.04でapt-get install mysql-serverでインストールしたもの)

参考サイト

http://memoyasu.blogspot.jp/2011/11/mysqlutf8.html
MySQLのバージョンが同じなので一番確か

http://bty.sakura.ne.jp/wp/archives/56
以前(Ubuntu10.04 MySQL5.1)ではこのサイトに習って設定したが、
Ubuntuのバージョンを上げた結果MySQLもバージョンが変わり、設定ファイルの書き方が変わってしまたため、そのままコレに従って変更したらsudo /etc/init.d/mysql restartが失敗する。

http://ext.omo3.com/linux/mysql_character_set.html
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/ |
+--------------------------+----------------------------+

または

mysql> status;

Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8

なぜか一部utf-8

設定ファイル

/etc/mysql/my.cnf

変更

/etc/mysql/my.cnfの中から[client]や[mysqld]や[mysql]を検索し、その直後にそれぞれ次のように追加

[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

エンコーディングの設定は
clientはそのままClient、mysqldはServer、mysqlはDbってことだと思う。
ClientだけなぜかUTF-8だったけど一応すべて明示的にUTF-8に設定した。

再起動

$ sudo /etc/init.d/mysql restart

確認

mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

または

mysql> status;

Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8

確かにすべてutf8に設定できていることが確認できた。