Converter tabelas latin1 / utf8mb3 para utf8mb4
MySQLManutençãoComando
-- 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;O que faz
Encontra colunas e tabelas que não são utf8mb4 e gera o DDL de conversão; CONVERT TO altera tanto o default da tabela quanto todas as colunas de caracteres, habilitando emoji / caracteres de 4 bytes.
Quando usar
Em schemas migrados da 5.x, em erros 'Incorrect string value' (1366) e quando joins entre colunas com collations diferentes não conseguem usar índices.
Atenção
CONVERT TO reescreve a tabela com COPY e bloqueia escritas durante toda a operação (INPLACE não é suportado); em tabelas grandes rode o mesmo --alter via pt-online-schema-change / gh-ost. utf8mb4 usa 4 bytes por caractere: um VARCHAR(255) indexado passa a ter 1020 bytes; o limite é 3072 bytes com o row format DYNAMIC / COMPRESSED e 767 com COMPACT / REDUNDANT, acima do qual ocorre o erro 1071. Colunas VARCHAR / TEXT são promovidas a um tipo maior (TEXT → MEDIUMTEXT) quando necessário para manter a mesma capacidade de caracteres. Uma mudança de collation afeta ordenação e comparação: utf8mb4_0900_ai_ci é insensível a acentos e maiúsculas/minúsculas, então valores que antes eram diferentes podem colidir em um índice único (1062). Converta juntas as tabelas que fazem join entre si. A conexão do cliente também precisa usar utf8mb4.