#Как проявляется проблема и где искать причину
MySQL принимает полноценные эмодзи только при корректной передаче Unicode и хранении в совместимом наборе символов, как правило utf8mb4. Кодировка utf8mb3 и неправильная кодировка соединения могут приводить к Incorrect string value.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Столбец в utf8mb3Столбец не поддерживает четырёхбайтовые символы | Кириллица сохраняется, эмодзи даёт ошибку | Подготовить изменение кодировки конкретного столбца |
| Клиент передаёт неверные байтыОшибка есть только у части приложений | В mysql CLI utf8mb4 работает, в API — нет | Настроить charset на подключении |
#Пошаговая диагностика и устранение
- 1. Зафиксируйте сообщение MySQLВ приложении найдите точный текст ошибки и код, например Incorrect string value. Зафиксируйте имя поля без копирования пользовательского текста в открытый журнал. Проверьте, что ошибка возникает именно с символом вне базовой многоязычной плоскости.
- 2. Посмотрите кодировку текущей сессииВ том соединении, где возникает проблема, прочитайте переменные клиента, соединения и результата. Если любой участок использует utf8mb3 или иной набор, исправление таблицы без клиента может не помочь.
- Дополнительная команда по темеSQLКомандаmysql-клиент; для приложения желательно аналогично проверить параметры его живого соединения.
SHOW VARIABLES LIKE 'character_set_%';
- 3. Проверьте проблемный столбецВыполните SHOW FULL COLUMNS и найдите Collation нужного текстового столбца. Кодировка обычно видна по имени сортировки: utf8mb4_... указывает на четырёхбайтовый UTF-8.SQLКомандаЗамените таблицу на реальную, чтение.
SHOW FULL COLUMNS FROM appdb.messages;
- 4. Проверьте настройки базыВ SQL-клиенте прочитайте CREATE DATABASE и сравните кодировку схемы и столбца. Кодировка по умолчанию схемы не преобразует автоматически уже существующие поля.
- Показывает параметры по умолчанию только для названной базыSQLКомандаПоказывает параметры по умолчанию только для названной базы.
SHOW CREATE DATABASE appdb;
- 5. Проверьте правильность драйвераДля PHP mysqli/PDO, Python mysql-connector или другого драйвера используйте его штатный параметр charset=utf8mb4 при открытии соединения. SET NAMES utf8mb4 применяется только к текущей сессии и годится для диагностического теста.
- В mysql-клиенте, только текущий сеансSQLКомандаВ mysql-клиенте, только текущий сеанс.
SET NAMES utf8mb4;
- 6. Испытайте запись в отдельной таблицеСоздайте тестовую таблицу/схему с utf8mb4 после разрешения DBA. Вставьте контрольную строку с кириллицей и одним эмодзи из того же приложения, затем прочитайте её обратно и сравните байты. Если тест проходит, причина в структуре исходного поля.
- 7. Спланируйте миграцию столбцаСнимите резервную копию и изучите размер таблицы, состав индексов и зависимости. Только после успешного испытания ALTER TABLE на копии переводите конкретный столбец на utf8mb4 в согласованное окно; удаление индексов ради обхода ошибочного ограничения не допускается.
- 8. Проверьте всю цепочкуПосле исправления на тесте выполните запись через веб-приложение, чтение через MySQL и повторное отображение в браузере. Успех — одинаковый текст на всех этапах без вопросительных знаков и ошибки сервера.
#Как проверить результат
В тестовой и проверенной рабочей цепочке эмодзи сохраняются целиком, кириллица и сортировка не повреждены.
#Если исправление не помогло
Если символы уже превратились в «?», простая смена кодировки их не восстановит — потребуется корректный оригинал или резервная копия.