プログラミングの役立つ記事をお届けします

MySQL5.5で携帯の絵文字対応の為に文字コードをutf8mb4にする方法

どうも、タカフです。

MySQLに絵文字が格納出来ないことにはまり、結論としては文字コードをutf8mb4に設定することで解決したのですが、
このWEBデベロッパーなら必ず一度はつまずく「MySQLの文字コード」について本日の記事にしたいと思います。

と、その前に今回の記事は、MySQLと言えばのサイト「漢のコンピューター道」の奥野様の本を多いに参考にしました。
http://www.amazon.co.jp/exec/obidos/asin/4774142948
MySQLを勉強するならこれ以上の本はないです。買っておいて損はしないと思います。是非。

それでは本題。まず、今現在私のテストサーバーのmysqlにログインして以下のコマンドを叩いてみました。

bash
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

結果がこのようになりました。

bash
+--------------------------+-------------------+
| 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に対する照合順序

図にするとこんな感じ(上述の本を参考に書いてます)

mysql_string_code

ここで重要なのはcharacter_set_database、character_set_serverです。
この文字コードが実際のデータとして格納される文字コードになるからです。

そして、これらを変更するには、my.cnfの記述を変更していくのですが、以下のように変更すると

my.cnf
[mysqld]
character_set_server=utf8mb4
これらの変数に反映されます。
character_set_database
character_set_server
collation_database
collation_server

また、クライアントからの接続時の文字コードは、以下のように変更すると

my.cnf
[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を再起動します。

bash
# sudo service mysqld restart

そしてもう一度先のSHOW VARIABLES…をやってみた結果が以下の通りです。

bash
+--------------------------+--------------------+
| 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 |
+--------------------------+--------------------+
見事、必要な箇所がutf8mb4に変わりました。
これで今後MySQLの文字コードに悩まされることはないでしょう。

現場からは以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です