Сохранение символов эмодзи в базе данных mysql

Я пытаюсь сохранить некоторые данные в базе данных mysql, ввод содержит символы эмодзи, например: '\U0001f60a\U0001f48d', и я получаю эту ошибку:

1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x8A\\xF0\\x9F...' for column 'caption' at row 1"

Я искал в сети и прочитал много ответов, включая следующие: или MySQL utf8mb4, ошибки при сохранении эмодзи или https://mathiasbynens.be/notes/mysql-utf8mb4#character-sets или http://www.java2s.com/Tutorial/MySQL/0080__Table/charactersetsystem.htm но ничего не получилось!!

У меня разные проблемы:

вот информация mydb:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8_general_ci    |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

Я попытался изменить значение character_set_server на utf8mb4 с помощью

mysql>SET character_set_server = utf8mb4
Query OK, 0 rows affected (0.00 sec)

Но при перезагрузке mysqld все возвращается!

У меня также нет файла /etc/my.cnf, и вместо этого я отредактировал файл /etc/mysql/my.cnf.

Что я должен делать? Как я могу сохранить файл смайликов в моей базе данных?


person Hosein Remezan    schedule 20.04.2016    source источник
comment
Ну да, эти настройки возвращаются. Вам необходимо установить кодировку соединения всякий раз, когда вы подключаетесь к базе данных, как само собой разумеющееся. Как именно вы пытаетесь вставить какое именно значение?   -  person deceze♦    schedule 20.04.2016
comment
Я разрабатываю приложение Django и использую python django.db.backends.mysql в качестве движка для подключения к серверу MySQL.   -  person Hosein Remezan    schedule 20.04.2016
comment
Сможете ли вы найти решение?   -  person Vahid Najafi    schedule 30.10.2016
comment
На самом деле я не мог редактировать существующую базу данных, но когда я создаю новую с сопоставлением utf8mb4, все работает нормально.   -  person Hosein Remezan    schedule 31.10.2016


Ответы (1)


1-я или 2-я строка в исходном коде (чтобы в коде были литералы в кодировке utf8: # -- coding: utf-8 --

Ваши столбцы/таблицы должны быть CHARACTER SET utf8mb4

Версия пакета python «MySQL-python» должна быть не ниже 1.2.5 для обработки utf8mb4.

self.query('SET NAMES utf8mb4') может понадобиться.

Джанго нужно client_encoding: 'UTF8' — я не знаю, должно ли это быть «utf8mb4».

Ссылки:
https://code.djangoproject.com/ticket/18392
http://mysql.rjweb.org/doc.php/charcoll#python

person Rick James    schedule 22.04.2016
comment
Предупреждение. Это вызовет ошибку в Windows: stackoverflow.com/questions/38813689/ - person User; 09.12.2016