utf8mb4: проверяем хранение символов за пределами трёх байт
Проверяем поддержку четырёхбайтовых символов MySQL на всём пути от клиента до столбца.
- ПриложениеПередаёт текст без потери символов
- СоединениеИспользует согласованную utf8mb4
- СтолбецХранит символы, включая четырёхбайтовые
Кириллица записывается нормально, а эмодзи превращается в вопросительный знак или вызывает ошибку. Возможная причина — кодировка MySQL, которая не поддерживает нужный символ. Utf8mb4 решает эту часть задачи, но настроить её нужно и у столбца, и у соединения. Проверим цепочку на одном символе с заранее известными байтами.
Проверяем свежую цепочку записи
SET NAMES utf8mb4;
CREATE TABLE demo_unicode (
id integer PRIMARY KEY,
body varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
INSERT INTO demo_unicode VALUES (1, CONVERT(0xF09F9880 USING utf8mb4));
SELECT id, HEX(body), CHAR_LENGTH(body), LENGTH(body) FROM demo_unicode;
SHOW CREATE TABLE demo_unicode;Шестнадцатеричная запись задаёт один дополнительный символ Unicode независимо от того, умеет ли терминал его показать. Для этой строки ожидается один символ, четыре байта и исходная последовательность F09F9880. Различие CHAR_LENGTH и LENGTH помогает проверить хранение без визуального доверия к шрифту. После этого полезно повторить запись обычным текстом через тот драйвер, которым пользуется приложение.
Кодировка не равна сравнению
utf8mb4 определяет представление символов, а collation задаёт правила сравнения и сортировки. Выбранное в примере сравнение удобно для демонстрации, но его нельзя автоматически назначать всем идентификаторам. Перед миграцией проверьте требования к регистру, акцентам и уникальности. Две ранее различные строки могут начать считаться одинаковыми после смены правил сравнения. Подготовьте несколько контрольных пар заранее и сохраните ожидаемый результат сравнения для каждой пары. Это превращает обсуждение правил сортировки в конкретную проверку.
Существующие таблицы требуют подготовки
Изменение кодировки базы по умолчанию не переписывает автоматически уже созданные текстовые столбцы. Сначала изучите SHOW CREATE TABLE, настройки отдельных колонок и способ подключения клиентов. Для преобразования рабочих данных подготовьте резервную копию, контрольный набор строк и оценку длительности изменения таблицы. Размер байтового представления влияет также на ограничения индексов.
Смена объявления на utf8mb4 не восстановит уже повреждённый текст. Сначала сохраните исходные данные и выясните, какие байты попали в столбец. После исправления проверьте старую кириллицу, новый дополнительный символ, поиск и уникальные ключи через само приложение. Исправление кодировки и ремонт старых строк — отдельные задачи.
