2013-11-24

DjangoでMySQLにunicode絵文字を登録できるようにする(utf8mb4対応)

Djangoを使っているプロジェクトでMySQLにunicode絵文字を投入したくなったので。

Unicode絵文字

iOSで使える絵文字キーボードに含まれる絵文字はUTF-8で符号化した時に4バイトになる。UTF-8で符号化した時に4バイトになるのは一部も漢字もそうだが具体的にはこのあたり。
MacOSXだとことえりで「ハート」を変換すると1F493のBEATING HEARTあたりが出せる。Pythonでコードポイントを表示してみると次の通り。
(MySQL以前にUSC2だとサロゲートペアになるのでPythonを --enable-unicode=ucs4 でコンパイルしてないとおかしな結果になるかも。)

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チュートリアルで試すとこの通り。

このエントリーをはてなブックマークに追加