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