DBAtlas · Атлас эксплуатации баз данных

Конвертация таблиц latin1 / utf8mb3 в utf8mb4

MySQLОбслуживание

Команда

-- Columns that are not utf8mb4
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE CHARACTER_SET_NAME IS NOT NULL AND CHARACTER_SET_NAME <> 'utf8mb4'
  AND TABLE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema')
ORDER BY TABLE_SCHEMA, TABLE_NAME;

-- Generate conversion DDL for tables whose default charset is not utf8mb4
SELECT CONCAT('ALTER TABLE `', t.TABLE_SCHEMA, '`.`', t.TABLE_NAME,
              '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, ALGORITHM=COPY, LOCK=SHARED;') AS ddl
FROM information_schema.TABLES t
JOIN information_schema.COLLATIONS c ON c.COLLATION_NAME = t.TABLE_COLLATION
WHERE c.CHARACTER_SET_NAME <> 'utf8mb4' AND t.TABLE_TYPE = 'BASE TABLE'
  AND t.TABLE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');

-- Schema default and a single table
ALTER DATABASE legacy CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE legacy.cust CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, ALGORITHM=COPY, LOCK=SHARED;

Что делает

Находит столбцы и таблицы не в utf8mb4 и генерирует DDL для конвертации; CONVERT TO меняет и кодировку таблицы по умолчанию, и все символьные столбцы, позволяя хранить эмодзи / 4-байтовые символы.

Когда использовать

На схемах, перенесённых с 5.x, при ошибках 'Incorrect string value' (1366) и когда соединения между столбцами с разной сортировкой (collation) не могут использовать индексы.

Внимание

CONVERT TO переписывает таблицу через COPY и блокирует запись на всё время операции (INPLACE не поддерживается); на больших таблицах выполняйте тот же --alter через pt-online-schema-change / gh-ost. utf8mb4 использует 4 байта на символ: индексированный VARCHAR(255) становится 1020 байт; лимит — 3072 байта для формата строк DYNAMIC / COMPRESSED и 767 для COMPACT / REDUNDANT, сверх которого возникает ошибка 1071. Столбцы VARCHAR / TEXT при необходимости повышаются до большего типа (TEXT → MEDIUMTEXT), чтобы сохранить ту же символьную ёмкость. Смена collation влияет на сортировку и сравнение: utf8mb4_0900_ai_ci нечувствительна к диакритике и регистру, поэтому ранее различавшиеся значения могут столкнуться в уникальном индексе (1062). Конвертируйте соединяемые таблицы вместе. Клиентское соединение тоже должно использовать utf8mb4.

Открыть в DBAtlas →

Связанные материалы