Настройка charset в Django MySQL не работает, utf8mb4 заменен на utf8

Мой файл настроек выглядит следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # ...
        'OPTIONS': {
            'charset': 'utf8mb4',
        }
    },
}

После некоторых миграций (например, python manage.py migrate zero, python manage.py reset_db...), кодировка MySql изменилась с utf8mb4 на utf8.

enter image description here

docker volume ls
docker volume rm -f xx    # this not work, say "xx volume is in use"

# use this one cleard the volume.
docker-compose -f xx.yml down --volumes
< <
# ...
services:
  # ...
  db:
    image: mysql:5.7.18
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# ...
Я использую вышеуказанную команду для воссоздания томов докера, чтобы исправить это, но я хочу знать, почему, поэтому вот вопрос.

Пока я задаю этот вопрос, я пытаюсь посмотреть исходный код Django, чтобы найти причину, это помогает мне больше думать о моем вопросе, я пытаюсь воспроизвести этот вопрос, вот шаги:

  1. Сначала база данных была создана с помощью docker-compose, charset MySql - utf8mb4.
  2. Затем выполните "python manage.py migrate" для создания таблиц.
  3. Я хочу объединить миграции в одну, поэтому я использую эти команды для этого.
python manage.py migrage xx zero
rm xx/migrations/00*.py
python manage.py reset_db
python manage.py makemigrations
python manage.py migrate
  1. Я проверил команду, изменение db происходит из python manage.py reset_db.

Итак, я нашел reset_db, что сделал из django_extensions.

Вот код:

# file: management.commands.reset_db.py
# ...
connection = Database.connect(**kwargs)
drop_query = 'DROP DATABASE IF EXISTS `%s`' % database_name
utf8_support = '' if options['no_utf8_support'] else 'CHARACTER SET utf8'
create_query = 'CREATE DATABASE `%s` %s' % (database_name, utf8_support)
logging.info('Executing... "%s"', drop_query)
connection.query(drop_query)
logging.info('Executing... "%s"', create_query)
connection.query(create_query.strip())
# ...

reset_db сначала drop database, затем create database.

Я передаю команде один аргумент

python manage.py reset_db --no-utf8

затем кодировка базы данных изменилась на utf8mb4.

Вернуться на верх