MySQL и MariaDB LinuxWindowsmacOS 1366

Почему MySQL выдаёт Incorrect string value при записи эмодзи

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

ERROR 1366 (HY000) «Incorrect string value» при вставке эмодзи чаще всего означает, что один из участков цепочки кодировок не поддерживает четырёхбайтовый Unicode: соединение, столбец или прикладная библиотека. Устаревшее обозначение utf8 в MySQL 8.0/8.4 часто соответствует utf8mb3, в котором такие символы не помещаются; для них нужен utf8mb4.

В этой статье
  1. Что означает неисправность
  2. Возможные причины и признаки
  3. Пошаговая диагностика и решение
  4. Команды для диагностики и проверки
  5. Пример для отдельной тестовой базы или учебного проекта
  6. Проверка результата и дальнейшие действия

#Что означает неисправность

ERROR 1366 (HY000) «Incorrect string value» при вставке эмодзи чаще всего означает, что один из участков цепочки кодировок не поддерживает четырёхбайтовый Unicode: соединение, столбец или прикладная библиотека. Устаревшее обозначение utf8 в MySQL 8.0/8.4 часто соответствует utf8mb3, в котором такие символы не помещаются; для них нужен utf8mb4.

#Возможные причины и признаки

Возможная причинаКак узнатьЧто делать
Столбец использует utf8mb3Данные приходят правильно, но определение поля не поддерживает символы вне основной многоязычной плоскости.SHOW FULL COLUMNS показывает utf8mb3_* либо SHOW CREATE TABLE содержит utf8, и ошибка только на эмодзи.Согласованная миграция колонки к utf8mb4.
Неверная кодировка соединенияДрайвер отправляет байты UTF-8, но у сессии другой character_set_client.В той же сессии SELECT @@character_set_client даёт не utf8mb4.Установить utf8mb4 в конфигурации соединения драйвера.
Исходная строка уже поврежденаСторонний файл или скрипт неверно преобразовал данные, до MySQL попадают неправильные байты.В исходном приложении строка выглядит искажённой, LENGTH отличается от ожидаемого.Исправить исходное декодирование, не полагаясь на замену collation.

#Пошаговая диагностика и решение

  1. Снимите сообщение и определите проблемное полеВ журнале приложения найдите полную строку Incorrect string value и указанную колонку при INSERT или UPDATE. Зафиксируйте, появляется ли проблема только на эмодзи или также на обычной кириллице. Удалите из отчёта реальные пользовательские тексты и пароли. Важно отличить 1366 от ошибки длины 1406: они исправляются разными способами.
  2. Проверьте текст до передачи в MySQLВ редакторе кода найдите обработчик записи и убедитесь, что входная строка декодируется как UTF-8, а не преобразуется из Windows-1251 наугад. Выведите пробный эмодзи в тестовом интерфейсе, не сохраняющем данные: он должен отображаться верно ещё до обращения к базе. Если символ уже сломан, сначала устраните ошибку при чтении файла или HTTP-запроса.
  3. Откройте ту же БД в MySQL Workbench или клиенте mysqlВ Workbench выберите подключение → SQL Editor, в терминале используйте mysql -u ИМЯ_ПОЛЬЗОВАТЕЛЯ -p и ввод пароля по приглашению. SQL-запросы просмотра далее безвредны, но их результат относится только к текущему соединению. Подключение приложения может использовать другую кодировку, поэтому аналогичную проверку надо сделать и через его драйвер.
  4. Сравните кодировку соединения и конкретного столбцаВ SQL-редакторе выполните SHOW VARIABLES LIKE 'character_set_%'; и SHOW FULL COLUMNS FROM messages; с реальным именем таблицы. Ищите character_set_client/connection/results и collation поля content. Если поле имеет utf8mb3, а соединение utf8mb4, исправлять требуется тип поля; если поле уже utf8mb4, анализируйте соединение и исходную строку.
  5. Настройте кодировку клиента при создании соединенияДля нового тестового соединения mysql можно выполнить SET NAMES utf8mb4;; это изменяет только его параметры. В PHP с mysqli используйте $mysqli->set_charset("utf8mb4") сразу после подключения, в PDO MySQL укажите charset=utf8mb4 в DSN. Не ограничивайтесь командой, введённой отдельно в Workbench: веб-приложение использует другое соединение.
  6. Мигрируйте столбец только после оценки всех зависимостейЕсли столбец не utf8mb4, согласуйте копию БД и тестовое изменение ALTER TABLE ... MODIFY ... CHARACTER SET utf8mb4. При этом необходимо сохранить прежние NOT NULL, DEFAULT, индексы, сортировку и тип; общий скрипт без изучения SHOW CREATE TABLE опасен. На большой таблице оцените блокировки, время и совместимость реплик, не применяйте миграцию на живой базе без окна обслуживания.
  7. Проверьте вставку эмодзи на отдельной временной таблицеВ отдельной тестовой сессии создайте TEMPORARY TABLE с полем VARCHAR(50) CHARACTER SET utf8mb4, выполните INSERT пробной строки и SELECT. Ожидается отображение эмодзи без ошибки и длина CHAR_LENGTH, соответствующая числу символов. Если тест проходит, а рабочая таблица нет, проблема в её определении или коде приложения, не в поддержке Unicode сервером.
  8. Повторите исходный пользовательский сценарий и оцените откатВ тестовой версии приложения сохраните короткое сообщение с кириллицей и эмодзи, перечитайте из БД и выведите в интерфейсе. Если ошибка сохраняется, запишите значения кодировки соединения приложения и поля. При неудачной миграции восстанавливайте согласованную копию и прежнюю схему; не меняйте кодировку обратно на utf8mb3, если уже были сохранены четырёхбайтовые символы.

#Команды для диагностики и проверки

SQLКоманда
Только чтение в открытой сессии MySQL. messages — пример имени таблицы; замените на вашу. Для веб-приложения выполните аналогичную проверку из его собственного соединения.
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;
SHOW FULL COLUMNS FROM messages;

#Пример для отдельной тестовой базы или учебного проекта

SQL
Только собственная тестовая база. SET NAMES относится к текущей сессии, временная таблица будет удалена при выходе. Ожидается успешная запись и неизменное отображение эмодзи.
SET NAMES utf8mb4;
CREATE TEMPORARY TABLE whelp_emoji (content VARCHAR(50) CHARACTER SET utf8mb4);
INSERT INTO whelp_emoji (content) VALUES ('Привет 😀');
SELECT content, CHAR_LENGTH(content) FROM whelp_emoji;

#Проверка результата и дальнейшие действия

Исправление подтверждено, если через исходный драйвер приложение сохраняет и считывает эмодзи без 1366, в столбце стоит utf8mb4 и отображение не меняется после повторного подключения. Если отдельный SQL-тест проходит, а приложение нет, проверьте инициализацию кодировки драйвера и декодирование HTTP-формы. Не устраняйте проблему удалением эмодзи из пользовательских сообщений.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.