Django JSONField не может правильно кодировать смайлики

Я планирую хранить dict в Django JSONField. Один из ключей этой дикты - комментарий, который может ввести пользователь. А пользователи очень любят добавлять смайлики в свои комментарии...

Проблема в том, что некоторые смайлы, не сохраняются в БД должным образом. База данных - MySQL 8.0.31, версия Django - 4.0.8: JSONField поддерживается для этой среды, как сообщается в документации. Кодировка базы данных по умолчанию utf8mb4 и collation utf8mb4_general_ci.

С этой моделью :

class TestJSONField(models.Model):
    data = models.JSONField()

Вот тестовый пример :

comment=b'smiley : \xf0\x9f\x98\x8a'.decode()
t=TestJSONField(pk=1, data={'comment':comment})
t.save()
r=TestJSONField.objects.get(pk=1)
print('BEFORE :', comment)
print('AFTER :', r.data['comment'], '(str)')
print('AFTER :', r.data['comment'].encode(), '(utf-8 encoded bytes)')

which gives :

BEFORE : smiley : 😊
AFTER : smiley : ? (str)
AFTER : b'smiley : ?' (utf-8 encoded bytes)

Как вы можете видеть, смайл хранится неправильно. Этот смайл закодирован в 4 байта, это может быть источником проблемы, потому что с закодированными в 2 байта символами у меня нет никаких проблем.

При использовании TextField и использовании json dumps()/loads() у меня нет никаких проблем.

Есть ли у вас идея, как иметь 4 байта кодированных смайликов для сохранения в JSONField?

Настройки базы данных были utf8mb4, таблицы тоже, но не столбцы, которые были в utf8mb3. После изменения кодировки столбцов на utf8mb4, теперь все работает правильно.

Вернуться на верх