Django

Djangoでのmysql設定。ついでに絵文字対策 utf8mb4

Djangoの設定

初期の状態ではsqlite

Djangoでデータベース設定をする際はmysite/settings.pyで設定します。

mysqlを使用する場合は以下のように設定します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<DB名>',
        'USER': '<ユーザ名>',
        'PASSWORD': '<パスワード>',
        'HOST': '<サーバ名>',
        'PORT': '3306',
    }
}

 

Djangoでmysqlを利用するためにはモジュールmysqlclientが必要になりますのでインストールします。

pip install mysqlclient

 

上記の設定が完了したら以下のコードを実行します。

python manage.py migrate

これで初期データベスが作成されます。

Django + mysqlでutf8mb4を使う

 

絵文字とかを入力/出力で利用するためにはmysqlのcharsetをutf8mb4にするだけでは入力/出力時にエラーが発生します。

Django側にも一つ以下の設定が必要となります。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<DB名>',
        'USER': '<ユーザ名>',
        'PASSWORD': '<パスワード>',
        'HOST': '<サーバ名>',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4', #OPTIONSを追加する
        },
    }
}

 

mysql側 データベース設定 (utf8mb4)

✅mysql側の文字コードの確認

mysql> show variables like '%character%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | latin1                       |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | latin1                       |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mysql57/charsets/ |
+--------------------------+------------------------------+

既存の設定がutf8になっており、絵文字が扱えない状態。

✅設定ファイル(my.cnf)の格納場所を調べる

mysql --help | grep my.cnf

 

✅my.cnfを以下の通り変更する

[mysqld]
character-set-server=utf8mb4  #←[mysqld] に追加

[client]
#default-character-set = utf8 #←コメントアウト
default-character-set = utf8mb4 #←[client] に追加

 

✅mysqlの文字コード設定を確認

mysql> show variables like '%character%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8mb4                      |
| character_set_connection | utf8mb4                      |
| character_set_database   | utf8mb4                      |
| character_set_filesystem | binary                       |
| character_set_results    | utf8mb4                      |
| character_set_server     | utf8mb4                      |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mysql57/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)

文字コードの変更が適用されていることを確認

この状態であれば絵文字を登録することができるようになります。

既存テーブルへの文字コード変更

※ただし、この設定はあくまで、今後作成されるテーブルに対しての設定になります。既存で作成されているテーブルに対しては文字コードの変更が適用されません。

既存テーブルに対しては面倒ですが以下のクエリで変更する必要があります。

ALTER TABLE <テーブル名> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

 

DjangoでModelの作成Modelの作成 Djangoは最近の主流であるコードファーストでDB(テーブル)を作成します。 polls/models.py ...