Djangoを使っているプロジェクトでMySQLにunicode絵文字を投入したくなったので。
Djangoチュートリアルで試すとこの通り。
Unicode絵文字
iOSで使える絵文字キーボードに含まれる絵文字はUTF-8で符号化した時に4バイトになる。UTF-8で符号化した時に4バイトになるのは一部も漢字もそうだが具体的にはこのあたり。
Emoticons Range: 1F600–1F64F
http://www.unicode.org/charts/PDF/U1F600.pdf
http://www.unicode.org/charts/PDF/U1F600.pdf
Miscellaneous Symbols and Pictographs Range: 1F300–1F5FF
http://www.unicode.org/charts/PDF/U1F300.pdf
MacOSXだとことえりで「ハート」を変換すると1F493のBEATING HEARTあたりが出せる。Pythonでコードポイントを表示してみると次の通り。http://www.unicode.org/charts/PDF/U1F300.pdf
(MySQL以前にUSC2だとサロゲートペアになるのでPythonを --enable-unicode=ucs4 でコンパイルしてないとおかしな結果になるかも。)
MySQLのcharcter setのutf8は3バイトまでの文字しか扱えないため、MySQL5.5で4バイトの文字を扱えるようにしたutf8mb4というcharcter setが追加された。
MySQLのcharcter setのutf8は3バイトまでの文字しか扱えないため、MySQL5.5で4バイトの文字を扱えるようにしたutf8mb4というcharcter setが追加された。
データベースのdefault charsetをutf8mb4にする
python manage.py syncdbによって生成されるCREATE文はDEFAULT CHARSET指定が無い、よってデータベース作成時に指定しておくのが良いだろう。python Djangoチュートリアルを例にすると
mysql> create database django_tutorial default charset utf8mb4; Query OK, 1 row affected (0.00 sec)
settings.pyのDB接続オプションでutf8mb4を指定する
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'root', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', 'TIME_ZONE': '+09:00', 'OPTIONS': { 'charset': 'utf8mb4' } } }これでunicode絵文字のINSERT、SELECTが上手くいくようになる。
Djangoチュートリアルで試すとこの通り。