Djangoを使っているプロジェクトでMySQLにunicode絵文字を投入したくなったので。
これでunicode絵文字のINSERT、SELECTが上手くいくようになる。
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を指定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'mydatabase' , 'USER' : 'root' , 'PASSWORD' : 'password' , 'HOST' : 'localhost' , 'PORT' : '3306' , 'TIME_ZONE' : '+09:00' , 'OPTIONS' : { 'charset' : 'utf8mb4' } } } |
Djangoチュートリアルで試すとこの通り。
