Как использовать эмодзи в проекте Python + Django + MySQL

Вы когда-нибудь получали подобную ошибку при сохранении некоторого текста, содержащего эмодзи, в базу данных?

DataError at /admin/myapp/mymodel/1/change/
(1366, "Incorrect string value: '\\xF0\\x9F\\x99...' for column 'text' at row 1")

Чтобы решить эту проблему, вы должны изменить кодировку базы данных и приложения на utf8mb4:

MySQL

  • Сделайте резервную копию вашей базы данных
  • Отредактируйте конфигурацию MySQL и добавьте/установите настройки кодировки:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
#
# * Character Set
#
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
  • Обновите набор символов таблиц базы данных до utf8mb4:
SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS alter_statement
FROM information_schema.tables
WHERE table_schema = 'mydatabasename';
  • Запустите сгенерированные операторы ALTER
  • Перезапустите MySQL:
/etc/init.d/mysql restart

Django

  • Добавьте параметр charset со значением utf8mb4 в настройки вашей базы данных:
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        # ...
        "OPTIONS": {
            "charset": "utf8mb4",
        },
    },
}
  • Перезапустите сервер приложений

Вывод

Теперь вы можете хранить эмодзи в своей базе данных!