Я пытаюсь сохранить имена пользователей из службы в моей базе данных MySQL. Эти имена могут содержать смайлики, такие как 🙈😂😱🍰 (только для примера)
После небольшого поиска я обнаружил, что этот стекопоток связан с этим руководством. Я следовал за шагами, и похоже, что все настроено правильно.
У меня есть база данных (набор символов и сопоставление, равные utf8mb4 (_unicode_ci)), таблица с именем TestTable, также настроенная таким образом, а также столбец "Текст", настроенный таким образом (VARCHAR (191) utf8mb4_unicode_ci).
Когда я пытаюсь сохранить эмодзи, я получаю сообщение об ошибке:
Example of error for shortcake (🍰):
Warning: #1300 Invalid utf8 character string: 'F09F8D'
Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1
Единственное эмодзи, которое мне удалось спасти, это солнце was
Хотя я не пытался все из них, чтобы быть честным.
Что-то мне не хватает в конфигурации?
Обратите внимание: все тесты сохранения не были связаны с клиентской стороной. Я использую phpmyadmin, чтобы вручную изменить значения и сохранить данные. Поэтому о правильной конфигурации клиентской части я буду заботиться после того, как сервер должным образом сохранит эмодзи.
Еще одно замечание: в настоящее время при сохранении смайликов я либо получаю ошибку, как указано выше, либо не получаю ошибку, и данные имени Username 🍰
будут сохранены как Username????
, Ошибка или нет ошибки зависит от того, как я сохраняю. При создании/сохранении с помощью оператора SQL я сохраняю с вопросительными знаками, при редактировании inline я сохраняю с вопросительными знаками, при редактировании с помощью кнопки редактирования я получаю ошибку.
благодарю вас
РЕДАКТИРОВАТЬ 1: Хорошо, так что я думаю, что я обнаружил проблему, но не решение. Похоже, что конкретные переменные базы данных не изменились должным образом.
Когда я вошел в систему как root на моем сервере и считал переменные (глобальные):
Используемый запрос: 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 | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
Для моей базы данных (в phpmyadmin, тот же запрос) это выглядит следующим образом:
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
Как я могу настроить эти параметры для конкретной базы данных? Также, хотя у меня есть первые показанные настройки по умолчанию, при создании новой базы данных я получаю вторую как настройки.
Изменить 2:
Вот мой файл my.cnf
:
[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
log_error=/var/log/mysql/error.log
max_connections=200
max_user_connections=30
wait_timeout=30
interactive_timeout=50
long_query_time=5
innodb_file_per_table
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
!includedir /etc/mysql/conf.d/