Бесплатный экспресс-аудит сайта Безопасность, SEO, AI-поиск и 152-ФЗ — отчёт с баллами за минуту Проверить сайт
Обсудить проект

Incorrect string value: ошибка кодировки при сохранении данных

Текст ошибки:

Incorrect string value: '\xF0\x9F\x98\x8A' for column 'NAME' at row 1

Последовательность, начинающаяся с \xF0, — это четырёхбайтовый символ: эмодзи, редкий иероглиф или специальный знак.

Что произошло

В MySQL кодировка с именем utf8 (она же utf8mb3) хранит символы длиной до трёх байт. Эмодзи занимают четыре, и база отказывается их записывать. Полноценная кодировка называется utf8mb4 — именно её требует вендор.

На сайтах, поставленных много лет назад, таблицы остались в utf8mb3: тогда это было нормой.

Как проверить, что у вас

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

Порядок перевода

  1. Снимите резервную копию базы и проверьте, что она разворачивается.
  2. Переведите на копии: база, затем все таблицы и текстовые колонки в utf8mb4 с нужной сортировкой.
  3. Укажите кодировку соединения в настройках продукта, чтобы запросы шли в той же кодировке.
  4. Проверьте на копии: сохранение элементов с эмодзи, поиск, сортировку по названиям, обмен с 1С.
  5. Повторите на боевом сайте в окно обслуживания.

Что ещё ломается из-за кодировки

  • Поиск не находит слова с буквой «ё» или смешивает регистр — обычно это разные сортировки в соседних таблицах.
  • Обрезанные строки после переноса: данные сохранялись в одной кодировке, читаются в другой.
  • Ошибка про длину ключа при переводе таблиц: в utf8mb4 символ занимает больше места, и длинные индексы перестают помещаться. Лечится уменьшением длины индексируемой части поля.

Частые вопросы

Какая кодировка и сортировка нужны?

Вендор требует utf8mb4. Сортировка для MySQL 8.x и 9.x — utf8mb4_0900_ai_ci, для MariaDB 10.x и 11.x — utf8mb4_unicode_ci. Смешивать сортировки в одной базе не стоит: сравнение строк начнёт работать непредсказуемо.

Можно просто запретить пользователям вводить эмодзи?

Так делают, но это лечение симптома: эмодзи приходят из писем, из CRM-форм, из обменов с маркетплейсами. Перевод базы на utf8mb4 решает вопрос один раз.

Перевод базы опасен?

Операция массовая и на большой базе долгая, поэтому делается на копии с проверкой, а на бою — в окно с остановкой сайта и свежей резервной копией. Сам по себе перевод данные не портит, но прерванная посреди процесса конвертация оставит базу в смешанном состоянии.