Migrating UTF8 to UTF8-MB4 on MariaDB

ブログ記事に絵文字を使いたいので変更してみた。

設定方法

現状の確認。

> show variables like "chara%";
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)  

設定ファイルの修正。

クライアント・サーバ両方修正する。

mariadbのcnfには以下のようにそれっぽいディレクティブが複数ある。

client.cnf

[client]
[client-mariadb]

server.cnf

[mysqld]
[mysqld-5.5]
[mariadb]
[mariadb-5.5]

違いは設定ファイルのコメントにあるとおりmariadb独自のものは[mariadb]ディレクティブに書けば良いらしい。互換性のためにあるのかな。基本的に[mariadb]ディレクティブを使うという方針で良さそう。

こんな感じで設定する。

client.cnf

[client-mariadb]
default-character-set = utf8mb4  

server.cnf

[mariadb]
character-set-server = utf8mb4  

設定後mariadbをrestartすれば適用される。

> show variables like "chara%";
+--------------------------+----------------------------+
| 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                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)  

これで絵文字が使えるようになる(使えない絵文字もあった。酒とか)。

Yay!

utf8とutf8mb4の違い

utf8は1~3バイトを扱える。utf8mb4は1~4バイトを扱える。ただし、utf8は本来1~4バイトが使える。mysqlでのみの事情。

以下のスライドが参考になった。

MySQLの文字コード事情 from Masahiro Tomita

参考

以下の検証が分かりやすかった。