MySQL で iOS の絵文字(4bytes UTF-8)が切れる
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 5.5.4が与えるインパクト!
- UTF-8で4バイトになる文字 at softelメモ
- iOS Emoji
- MySQLで4バイトのUTF-8文字を扱ってみる - HHeLiBeXの日記 正道編