どうも、タカフです。
MySQLに絵文字が格納出来ないことにはまり、結論としては文字コードをutf8mb4に設定することで解決したのですが、
このWEBデベロッパーなら必ず一度はつまずく「MySQLの文字コード」について本日の記事にしたいと思います。
と、その前に今回の記事は、MySQLと言えばのサイト「漢のコンピューター道」の奥野様の本を多いに参考にしました。
http://www.amazon.co.jp/exec/obidos/asin/4774142948
MySQLを勉強するならこれ以上の本はないです。買っておいて損はしないと思います。是非。
それでは本題。まず、今現在私のテストサーバーのmysqlにログインして以下のコマンドを叩いてみました。
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
結果がこのようになりました。
+--------------------------+-------------------+
| 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 |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+-------------------+
安定のlatin1が入り込んでますね~。
このシステム変数のそれぞれの意味は以下のようになります。(上述の本を参考に書いてます)
character_set_client : クライアントがMySQL ServerにSQL文を送信する際に用いる文字コード
character_set_connection : MySQL Serverがクエリを実行する際、リテラル値の解釈に用いる文字コード
character_set_database : データベースのデフォルトの文字コード
character_set_filesystem : MySQL Serverがファイルシステムにアクセスする際、ファイル名の解釈に用いられる文字コード
character_set_results : MySQL Serverからクライアントへ実行結果を用いる際に用いられる文字コード
character_set_server : サーバーのデフォルトの文字コード
character_set_system : テーブルやカラムなどのオブジェクト名に対して用いられる文字コードで、値は常にutf8
collation_connection : character_set_connectionに対する照合順序
collation_database : character_set_databaseに対する照合順序
collation_server : character_set_serverに対する照合順序
図にするとこんな感じ(上述の本を参考に書いてます)
ここで重要なのはcharacter_set_database、character_set_serverです。
この文字コードが実際のデータとして格納される文字コードになるからです。
そして、これらを変更するには、my.cnfの記述を変更していくのですが、以下のように変更すると
[mysqld]
character_set_server=utf8mb4
character_set_database
character_set_server
collation_database
collation_server
また、クライアントからの接続時の文字コードは、以下のように変更すると
[mysql]
default-character-set=utf8mb4
character_set_client
character_set_connection
character_set_results
collation_connection
※因みに、クライアントからの接続時の文字コードは、my.cnfを使わない方法として、
SET NAMES utf8mb4;
があります。私だけの環境かもしれませんが、my.cnfでutf8mb4に設定したのにMySQL Workbenchで見るとutf8に切り替わったりすることがあったので、最終的にこのクエリを流せばクライアント側の文字コードを一括で変えることが出来ます。
そして、my.cnfを設定したらmysqlを再起動します。
# sudo service mysqld restart
そしてもう一度先のSHOW VARIABLES…をやってみた結果が以下の通りです。
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+--------------------------+--------------------+
これで今後MySQLの文字コードに悩まされることはないでしょう。
現場からは以上です。