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, теперь все работает правильно.