Добавляем emodji
Пошаговое руководство изменения кодировки mysql базы данных и таблиц для того, чтобы можно было использовать emodji символы.
Начинаем
? Сделай полный бэкап, и помни, что действуешь на свой страх и риск.
В настройках сайта в словарь DATABASES нужно добавить опцию charset. Должно стать примерно так:
settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DBName',
'USER': 'BNUser',
'PASSWORD': 'DBPass',
'OPTIONS': {
...
'charset': 'utf8mb4',
}
}
}
...
Сначала надо понять, какую базу данных и какие таблицы будем менять. Следующий код сформирует запросы на изменение БД и всех таблиц в ней. После запуска этого кода, можно будет взять только те запросы, которые меняют кодировку у нужных таблиц.
mysql code
# Используем таблицу
use `information_schema`;
# Получим запрос на изменение кодировки для БД DBName (DBName изменить на свою БД)
select
concat("alter database `", table_schema , "` character set = utf8mb4 collate = utf8mb4_unicode_ci;") as query
from
`TABLES`
where
`table_schema` like "DBName"
group by
`table_schema`;
# Получим запрос на изменение кодировки для всех таблиц базы DBName (DBName изменить на свою БД)
select
concat("alter TABLE `",table_schema, "`.`" , table_name, "` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci;") as query
from
`TABLES`
where
`table_schema` like "DBName"
group by
`table_schema`,
`table_name`;
Вывод для БД
+-------------------------------------------------------------------------------+ | query | +-------------------------------------------------------------------------------+ | alter database `DBName` character set = utf8mb4 collate = utf8mb4_unicode_ci; | +-------------------------------------------------------------------------------+
Вывод для таблиц
+----------------------------------------------------------------------------------------------------------------+ | query | +----------------------------------------------------------------------------------------------------------------+ | alter TABLE `DBName`.`auth_group` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | | .... | | alter TABLE `DBName`.`django_admin_log` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | | alter TABLE `DBName`.`django_content_type` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | | alter TABLE `DBName`.`django_migrations` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | | alter TABLE `DBName`.`django_session` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | | alter TABLE `DBName`.`thumbnail_kvstore` CONVERT TO character set utf8mb4 collate utf8mb4_unicode_ci; | +----------------------------------------------------------------------------------------------------------------+
При выполнении запросов, у меня кое-где появлялась ошибка:
mysql error
#1071 - Specified key was too long; max key length is 767 bytes
Она возникает в случаях, когда поле model.CharField имеет длину 255. Изменил на 191, сделал миграцию — ошибка ушла:
Было
name = models.CharField(u'Название раздела', max_length=255, null=True, blank=True)
Стало
name = models.CharField(u'Название раздела', max_length=191, null=True, blank=True)
Обращу внимание, что у меня все это делалось на MariaDB v10.1.21


