MySQL で iOS の絵文字(4bytes UTF-8)が切れる

MySQL

MySQL に iOS の絵文字(4bytes UTF-8)が入った文字列を INSERT/UPDATE すると絵文字以降の文字がぶった切られる。

どういうことかというと、下の文字列を MySQL に INSERT/UPDATE する…

あいうえお [ 絵文字 ] かきくけこ

すると、このようになります。

あいうえお

symfony1.4 の Doctrine_Table_Exception Unserialization のエラーでこの不具合に気付きました。
データベースに入れた serialize データを unserialize したときに、上のエラーはかれてデータがぶった切られてることが判明したのです。

注意点

この不具合は MySQL 5.5 では直っています。直っているといってもキャラクターセットに utf8mb4 を指定しなければいけないようです。
MySQL 5.5 以上で、4 バイト UTF-8 に対応するための詳しい対応方法は、以下の記事が参考になります。
鯖管のメモ帳: mysql に 4バイトutf8 の文字を入れたい

対応策

MySQL のみでの対応だとバージョンアップするしかないので、それが難しいならアプリケーション側で対応するしかないです。

UTF-8において4バイトで表示する文字について,一覧表が載っているHPまたは本って… - Yahoo!知恵袋」によると以下を除外できればいいみたい。

外字 - Wikipedia より引用

JIS X 0221 (Unicode)における外字
=================================

Unicodeでは、外字エリアとして私用領域という名称でU+E000〜U+F8FF、U+000F0000〜U+000FFFFD、U+00100000〜U+0010FFFDに外字領域を設けてある。このうち、あとの2つは面単位で用意されているので、私用面と呼ばれる。

Windowsのユーザ外字領域であるShift_JISの0xF040〜0xF9FCはUnicodeのU+E000〜U+E757に順番に対応付けられている。(Shift_JISで0xF07Fなどの使用不可能なコードポイントは飛ばす。)

Windows付属の外字エディタではU+E758〜U+F8FFにも外字を作成可能であるが、そこに作成したものはUnicode環境でのみ使用可能となる。

WingdingsなどのシンボルフォントのグリフはUnicodeではU+F020〜U+F0FFの一部に対応付けられている。

ARIB外字や携帯電話の絵文字などこれまでは外字でしか使用できなかった文字についても、順次Unicodeに含めることが進められている。

正規表現でカットしちゃいましょう。

因みに PHP で serialize していたところは json_encode にすることで MySQL に INSERT/UPDATE することができました。
※配列を serialize していたので json_decode するときは第 2 引数を true にした。

参考記事

MySQL おすすめ書籍

MySQL おすすめ書籍#1 MySQL おすすめ書籍#2