utf8mb4: проверяем хранение символов за пределами трёх байт

2 мин чтения

Проверяем поддержку четырёхбайтовых символов MySQL на всём пути от клиента до столбца.

Unicode должен пройти всю цепочку
  1. ПриложениеПередаёт текст без потери символов
  2. СоединениеИспользует согласованную utf8mb4
  3. СтолбецХранит символы, включая четырёхбайтовые

Кириллица записывается нормально, а эмодзи превращается в вопросительный знак или вызывает ошибку. Возможная причина — кодировка 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 не восстановит уже повреждённый текст. Сначала сохраните исходные данные и выясните, какие байты попали в столбец. После исправления проверьте старую кириллицу, новый дополнительный символ, поиск и уникальные ключи через само приложение. Исправление кодировки и ремонт старых строк — отдельные задачи.

Источники и дальнейшее чтение