Добавляем 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