Incorrect string value: ошибка кодировки при сохранении данных
Текст ошибки:
Incorrect string value: '\xF0\x9F\x98\x8A' for column 'NAME' at row 1
Последовательность, начинающаяся с \xF0, — это четырёхбайтовый символ: эмодзи, редкий иероглиф или специальный знак.
Что произошло
В MySQL кодировка с именем utf8 (она же utf8mb3) хранит символы длиной до трёх байт. Эмодзи занимают четыре, и база отказывается их записывать. Полноценная кодировка называется utf8mb4 — именно её требует вендор.
На сайтах, поставленных много лет назад, таблицы остались в utf8mb3: тогда это было нормой.
Как проверить, что у вас
Посмотрите кодировку и сортировку базы и таблиц — через инструмент управления базой или запросом к служебным таблицам. Проверять нужно и базу, и каждую таблицу, и отдельные колонки: встречается смешанное состояние, когда база переведена, а старые таблицы нет.
Порядок перевода
- Снимите резервную копию базы и проверьте, что она разворачивается.
- Переведите на копии: база, затем все таблицы и текстовые колонки в
utf8mb4с нужной сортировкой. - Укажите кодировку соединения в настройках продукта, чтобы запросы шли в той же кодировке.
- Проверьте на копии: сохранение элементов с эмодзи, поиск, сортировку по названиям, обмен с 1С.
- Повторите на боевом сайте в окно обслуживания.
Что ещё ломается из-за кодировки
- Поиск не находит слова с буквой «ё» или смешивает регистр — обычно это разные сортировки в соседних таблицах.
- Обрезанные строки после переноса: данные сохранялись в одной кодировке, читаются в другой.
- Ошибка про длину ключа при переводе таблиц: в
utf8mb4символ занимает больше места, и длинные индексы перестают помещаться. Лечится уменьшением длины индексируемой части поля.
Частые вопросы
Какая кодировка и сортировка нужны?
Вендор требует utf8mb4. Сортировка для MySQL 8.x и 9.x — utf8mb4_0900_ai_ci, для MariaDB 10.x и 11.x — utf8mb4_unicode_ci. Смешивать сортировки в одной базе не стоит: сравнение строк начнёт работать непредсказуемо.
Можно просто запретить пользователям вводить эмодзи?
Так делают, но это лечение симптома: эмодзи приходят из писем, из CRM-форм, из обменов с маркетплейсами. Перевод базы на utf8mb4 решает вопрос один раз.
Перевод базы опасен?
Операция массовая и на большой базе долгая, поэтому делается на копии с проверкой, а на бою — в окно с остановкой сайта и свежей резервной копией. Сам по себе перевод данные не портит, но прерванная посреди процесса конвертация оставит базу в смешанном состоянии.