F.Ko-Jiの「一秒後は未来」

MySQLに絵文字を格納するにはutf8mb4を使う必要があった

この記事ではアフィリエイト広告を利用しています。

一体何年前の話をしてるんだと思われそうですが、スマートフォンなどで入力できる絵文字を MySQL にきちんと格納するには UTF-8 ではなく utf8mb4 という文字コードを使う必要があります。この文字コードは MySQL 5.5.3 以降で使えます。

» MySQL :: MySQL 5.5 Reference Manual :: 10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)

自分がほとんど絵文字を使わないのでまったく考慮してなかったのですが、「#グラドル自画撮り部 の部室」で Twitter から取り込んだツイートデータを見てみると、ツイートの文章が途中で切れてしまっているものが結構たくさんありました。

mysql-utf8mb4-01.jpg

↑ ほんとは最後にハッシュタグや画像の 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 に文字コードを変更しても文字化けしません。

が、途中で切れてしまったデータは存在しないので #グラドル自画撮り部 の部室では文字コードを変更して改めてツイートデータを取得し直しました。

mysql-utf8mb4-02.jpg

ちなみにPC版の Google Chrome は今のところ絵文字に対応していません。しかし Twitter の Web 版では絵文字がきちんと表示されます。どうやら Twitter が独自に絵文字の部分を画像に置き換えているためのようです。なお「Chromoji」という拡張機能を使うと Chrome でも絵文字が表示されるようになります。

» 【レビュー】「Google Chrome」でMac/iOSの“絵文字”を表示できるようにする拡張機能「Chromoji」 – 窓の杜

MySQL徹底入門 第3版 ~5.5新機能対応~
MySQL徹底入門 第3版 ~5.5新機能対応~

コメントを残す

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

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など