сохранение юникода в базу данных

115
12

Я пытаюсь сохранить следующую строку в базе данных mysql, используя django (я получил строку откуда-то еще)

m.cr1 = u"\U0001F3C9" # cr1 is models.CharField(max_length=50)
m.save()

Я получаю ошибку

Warning: Incorrect string value: '\xF0\x9F\x8F\x89' for column 'cr1' at row 1

Я рассмотрел другие связанные вопросы здесь и изменил mysql как utf8_unicode_ci, но это не помогает. В общем, мой код работает нормально с unicode, но не в этом конкретном случае.

Я предполагаю, что это связано с тем, что это 32 бита unicode.

Я просто хочу обнаружить этот случай и, возможно, проигнорировать плохие персонажи.

Есть идеи?

благодаря

спросил(а) 2021-01-19T13:15:36+03:00 2 месяца, 4 недели назад
1
Решение
75

MySQL utf8 - не настоящий UTF-8, а модифицированный, который поддерживает только коды до 0xFFFF. Вы пытаетесь использовать точку кода (0x1F3C9 > 0xFFFF), которая не включена в MySQL utf8.

Вам нужно иметь относительно новую версию MySQL и изменить utf8 на utf8mb4. Везде.

Соединение должно быть utf8mb4, сортировка, таблицы/столбцы и т.д. В любом случае, когда вы используете utf8 в контексте MySQL, это неверно и должно быть utf8mb4.

ответил(а) 2021-01-19T13:15:36+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема