Я намагаюся зберегти імена від користувачів із сервісу в базі даних MySQL. Ці імена можуть містити смайли типу 🙈😂😱🍰 (лише для прикладів)
Трохи пошукавши, я знайшов цей stackoverflow, що посилається на цей підручник . Я дотримувався кроків, і, схоже, все налаштовано належним чином.
У мене є База даних (набір символів та сортування 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
Єдиним смайликом, який я зміг зберегти належним чином, було сонце ☀️
Хоча я не намагався, щоб усі вони були чесними.
Щось мені не вистачає в конфігурації?
Зверніть увагу: усі тести збереження не залучали сторону клієнта. Я використовую phpmyadmin, щоб вручну змінювати значення та зберігати дані. Отже, правильна конфігурація на стороні клієнта - це те, про що я подбаю після того, як сервер правильно збереже смайлики.
Ще один Sidenote : В даний час при збереженні смайлів я або отримую помилку, як зазначено вище, або не отримую жодної помилки, і дані Username 🍰
будуть зберігатися як Username ????
. Помилка або відсутність помилки залежить від способу збереження. При створенні / збереженні за допомогою SQL Statement я зберігаю зі знаками запитання, при редагуванні в рядку - із знаками питання, при редагуванні за допомогою кнопки редагування отримую помилку.
Дякую
РЕДАКТУВАТИ 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/