Настройка 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.
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, чтобы найти причину, это помогает мне больше думать о моем вопросе, я пытаюсь воспроизвести этот вопрос, вот шаги:
- Сначала база данных была создана с помощью docker-compose, charset MySql - utf8mb4.
- Затем выполните "python manage.py migrate" для создания таблиц.
- Я хочу объединить миграции в одну, поэтому я использую эти команды для этого.
python manage.py migrage xx zero
rm xx/migrations/00*.py
python manage.py reset_db
python manage.py makemigrations
python manage.py migrate
- Я проверил команду, изменение 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.