MySQLに絵文字を格納するにはutf8mb4を使う必要があった
一体何年前の話をしてるんだと思われそうですが、スマートフォンなどで入力できる絵文字を MySQL にきちんと格納するには UTF-8 ではなく utf8mb4 という文字コードを使う必要があります。この文字コードは MySQL 5.5.3 以降で使えます。
自分がほとんど絵文字を使わないのでまったく考慮してなかったのですが、「#グラドル自画撮り部 の部室」で Twitter から取り込んだツイートデータを見てみると、ツイートの文章が途中で切れてしまっているものが結構たくさんありました。
↑ ほんとは最後にハッシュタグや画像の URL がついているはず。
調べてみると絵文字のところで文字列が切れてデータベースに保存されてました。
既存の UTF-8 のデータベースを utf8mb4 に変更するには、
- my.cnf で utf8 を指定している箇所を utf8mb4 に変更し、MySQLを再起動
- 「ALTER DATABASE データベース名 DEFAULT CHARACTER SET utf8mb4;」でデータベースの文字コードを変更
- 「ALTER TABLE テーブル名 DEFAULT CHARACTER SET utf8mb4;」でテーブルの文字コードを変更
- 「ALTER TABLE テーブル名 MODIFY カラム名 型 CHARACTER SET utf8mb4 [NOT NULL …]」でカラムの文字コードを変更
といった変更をおこなえば OK です。なお、ALTER TABLE はまとめて実行することもできます。詳しくは以下のドキュメントを参照のこと。照合順序を指定する方法も説明されています。
» MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.11 以前の Unicode サポートから現在の Unicode サポートへのアップグレード
mysql> show variables like '%char%'; +--------------------------+----------------------------+ | 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)
リファレンスに「For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.」とあるように、UTF-8 で扱える文字は utf8mb4 でも同一の文字コードなので、UTF-8 から utf8mb4 に文字コードを変更しても文字化けしません。
が、途中で切れてしまったデータは存在しないので #グラドル自画撮り部 の部室では文字コードを変更して改めてツイートデータを取得し直しました。
ちなみにPC版の Google Chrome は今のところ絵文字に対応していません。しかし Twitter の Web 版では絵文字がきちんと表示されます。どうやら Twitter が独自に絵文字の部分を画像に置き換えているためのようです。なお「Chromoji」という拡張機能を使うと Chrome でも絵文字が表示されるようになります。
» 【レビュー】「Google Chrome」でMac/iOSの“絵文字”を表示できるようにする拡張機能「Chromoji」 – 窓の杜
コメントを残す