Невозможно сохранить китайский символ ‘𧗽’ в MySQL с кодировкой utf8mb4 [закрыто]

Вопрос или проблема

Я столкнулся с проблемой при попытке сохранить китайский символ ‘𧗽’ (U+275FD) в таблице базы данных MySQL, которая использует набор символов utf8mb4. Я проверил, что как база данных, так и конкретная таблица настроены на utf8mb4, но при попытке вставить этот символ я все равно получаю ошибку.

Вот детали моей настройки:

Атрибут Значение
Версия MySQL 8.4.2
Версия PHP 8.3.12
Кодировка таблицы utf8mb4
Сравнение таблицы utf8mb4_unicode_ci
Кодировка столбца utf8mb4

Сообщение об ошибке

Общая ошибка: 1366 Неверное значение строки: 'U+275FD' для столбца 'chinese' в строке 1 [ INSERT INTO `Staff` (`staff_no`, `name`, `chinese`, `TYPE`, `email`, `sex`) VALUES ('12345', 'HANG HANG HANG', '𧗽', 'D', '[email protected]', 'M') ]  в /var/www/html/evs/vendor/opis/database/src/Connection.php:567
Трассировка стека:
#0 /var/www/html/evs/vendor/opis/database/src/Connection.php(426): Opis\Database\Connection->execute()
#1 /var/www/html/evs/vendor/opis/database/src/SQL/Insert.php(47): Opis\Database\Connection->command()
#2 /var/www/html/evs/cron/night-job.php(77): Opis\Database\SQL\Insert->into()
#3 {main}
  выброшено в /var/www/html/evs/vendor/opis/database/src/Connection.php on line 567

DBeaver может обновить китайский атрибут просто:

--  Автоматически сгенерированный SQL скрипт. Фактические значения для бинарных/сложных типов данных могут отличаться - то, что вы видите, является обычным строковым представлением значений.
UPDATE voting_system.Staff
    SET chinese="𧗽𧗽𧗽"
    WHERE staff_no='12345';

Без каких-либо ошибок.

Я был бы признателен за любые советы о том, почему этот символ не сохраняется корректно и какие шаги я могу предпринять для решения этой проблемы. Спасибо!

Ответ или решение

Невозможность сохранения китайского символа ‘𧗽’ в MySQL с использованием кодировки utf8mb4

Проблема, с которой вы столкнулись, касается хранения специфического китайского символа ‘𧗽’ (U+275FD) в базе данных MySQL, даже при условии, что вы используете кодировку utf8mb4. Давайте подробно разберем возможные причины и решения этой проблемы.

1. Ошибка и ее описание

Вы получили следующее сообщение об ошибке:

General error: 1366 Incorrect string value: 'U+275FD' for column 'chinese' at row 1

Эта ошибка указывает на то, что MySQL не может обработать один из символов, которые вы пытаетесь сохранить. Несмотря на то, что вы уже установили кодировку utf8mb4 для базы данных и таблицы, существует несколько факторов, которые могут мешать корректной обработке символов.

2. Проверьте настройки базы данных и таблицы

Вы упомянули, что используете кодировку utf8mb4 на уровне базы данных и таблиц. Чтобы убедиться в этом, выполните следующие SQL-команды:

SHOW VARIABLES LIKE 'character_set_database';
SHOW TABLE STATUS LIKE 'Staff';
SHOW FULL COLUMNS FROM Staff;

Это позволит вам подтвердить, что кодировка действительно установлена на utf8mb4. Ознакомьтесь также с текущей кодировкой соединения:

SHOW VARIABLES LIKE 'character_set_connection';

Если она отличается от utf8mb4, вам нужно будет установить её с помощью:

SET NAMES 'utf8mb4';

3. Проверьте версии MySQL и PHP

Убедитесь, что используемая вами версия MySQL (8.4.2) и PHP (8.3.12) адекватно поддерживают кодировку utf8mb4. Обобщим, что MySQL версии 5.5.3 и выше полностью поддерживает utf8mb4, что позволяет работать с символами в диапазоне выше U+FFFF.

4. Используйте параметры подключения

Проверьте, как идет соединение с базой данных через PHP. Убедитесь, что для подключения используются следующие параметры:

$dsn = 'mysql:host=your_host;dbname=your_dbname;charset=utf8mb4';
$options = [
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
];

$pdo = new PDO($dsn, 'username', 'password', $options);

Эти настройки гарантируют, что соединение будет использовать правильную кодировку.

5. Операции с ДБ без ошибок

Вы упомянули, что команда обновления из DBeaver работает без ошибок. DBeaver может использовать отличные от вашего PHP драйвера или настройки, которые могли бы обойти ошибки, возникающие в вашей среде. Попробуйте выполнить аналогичную команду из вашего PHP-кода, чтобы понять, сохраняется ли ошибка.

6. Прочие рекомендации

Если приведенные шаги не решают вашу проблему, рассмотрите:

  • Попробуйте создать временную таблицу с использованием кодировки utf8mb4 и посмотрите, сможете ли вы сохранить символ ‘𧗽’ в ней.
  • Если у вас установлены триггеры или ограничения, возможно, они конфликтуют с процессом вставки.

Заключение

Проблема с сохранением символа ‘𧗽’ в вашей базе данных скорее всего может быть связана с настройками соединения, используемыми драйверами или inconsistencies в конфигурации базы данных. Внимательно проверьте и протестируйте каждый из предложенных шагов, и, скорее всего, вы сможете решить возникшую проблему. Если же трудности останутся, рассмотрите возможность обращения на форумы поддержки или к профессиональным разработчикам MySQL.

Оцените материал
Добавить комментарий

Капча загружается...