Top > テクノロジー > プログラミング

MySQLで絵文字対策のためにutf8mb4を使う






utf8のMySQLでデータを格納している際に絵文字だと思われた場所から先が格納されず「あれ〜?」ってなったことはありませんか?

実はこれはutf8が絵文字に対応していないからなんです。
そんなMySQLでutf8mb4という文字エンコードを適用して絵文字対策をするまでを紹介します。

皆さん、iPhoneやAndroidの絵文字を使いますか?

僕は結構使います。そんなiPhoneやAndroidの絵文字ですが、実はMySQLで扱うためには一工夫が必要なのです。

今現在、MySQLは文字エンコードをutf8として運用されていることが多いように見受けられます。

日本語やマレー語にも対応してくれたutf8ならば絵文字も扱えるはずだ!と信じたいものですが、実は残念ながらiPhoneやAndroidの絵文字にはutf8は対応していません。

そんな絵文字に対応する方法を本記事では紹介します。

 

iPhoneやAndroidの絵文字に対応する文字エンコードはutf8mb4

 

なんでutf8は絵文字に対応してないのでしょうか?

これは、絵文字はマルチバイト文字の中でも4バイトの領域が必要な文字だからになります。

MySQLのutf8は、1~3バイトの文字しか格納できないので、絵文字が格納できないということになります。

実は、日本語の難しい漢字や一部中国語も4バイトが必要な漢字があるものがあります。

 

ということは、絵文字が多用される今、MySQLの文字コードはutf8mb4じゃないと正直現実的ではありません。

つまり、MySQLの運用にはutf8mb4が必要なことが多くなることが予想されます。

 

utf8mb4の適用

 

my.cnfに以下の記載を追加します。

 

innodb_large_prefix = ON 

innodb_file_format = Barracuda
innodb_file_format_max = Barracuda

 

innodb_large_prefixは、サイズの大きいカラムを許容する設定です。

utf8mb4は、4バイトの確保が必要なので、VARCHAR(255) のカラムを定義した際には、MySQLのデフォルトのサイズ制限を超えてしまいます。

また、innodb_large_prefixを適用するには、innodb_file_formatをBarracudaにする必要があり、テーブル作成時はROW_FORMATをDYNAMICにする必要があるのでお気をつけください。

 

上記の設定した上でMySQLのシステム変数のcharacter系統の変数をutf8mb4に変更する必要があります。

 

mysql> show variables like '%character%';
+--------------------------+-----------------------------------------------------+
| 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/local/Cellar/mysql/5.7.9/share/mysql/charsets/ |
+--------------------------+-----------------------------------------------------+

 

これで、新規で作成されるテーブルは全てutf8mb4になります。

 

既存のテーブルがutf8になってしまっている場合

 

あります。。。ありますよね!

あとで気付いたパターン。(僕もそうでした

DBの問題ってめんどくさいですよね・・・・!

 

とまぁ愚痴はここまでにして、あとからutf8mb4を設定する場合はどうするかというところを説明します。

前述の設定を全て設定し終わった後と仮定してお話しますね。

 

utf8mb4への変換方法は非常にシンプルで、やることは3点だけです。

  1. 既存のDBの文字コードをutf8mb4に変換
  2. 既存テーブルのROW_FORMATをDYNAMICに変換
  3. 既存テーブルの文字コードをutf8mb4に変換
ALTER DATABASE  CHARACTER SET utf8mb4; # DBのutf8化
ALTER TABLE  ROW_FORMAT=DYNAMIC; #ROW_FORMATの変換
ALTER TABLE  CONVERT TO CHARACTER SET utf8mb4; #テーブルのutf8mb化

以上で終了です。簡単でしょう?

-> 参考( MySQL utf8からutf8mb4への変換 - Qiita )

 

さあ!これであなたの絵文字格納ライフも順風満帆ですよ!


フォローして最新の情報をチェック!





おすすめ記事



人気記事ランキング



最新のお知らせ

2017年03月01日 株式会社FULL HOUSEが創業1年を迎えました!
2017年02月13日 TABI CHANNELが多言語対応しました
2017年01月09日 【祝】Petpedia のFBいいね数が1万を突破しました!
2017年01月01日 【謹賀新年】2017年もFULL HOUSEをよろしくお願い致します。
2016年12月30日 【新機能リリース】FULL HOUSE運営メディアの記事に目次が付きました

タグ一覧

英語学習(1)
おすすめ本(1)
おすすめ映画(1)
相談(2)
面談(1)
マナー(1)