Erros de collation no MySQL costumam aparecer em momentos inesperados: ao fazer um JOIN, ordenar resultados, comparar textos, importar dados antigos ou migrar um sistema de uma versão para outra. Um dos erros mais conhecidos é o “Illegal mix of collations”, que indica que o banco está tentando comparar textos configurados com collations diferentes.
Embora pareça um detalhe técnico pequeno, a collation influencia diretamente como o MySQL compara, ordena e diferencia caracteres. Em sistemas brasileiros, isso pode afetar acentos, letras maiúsculas e minúsculas, buscas por nomes, ordenação alfabética e comparações entre campos de tabelas diferentes.
O que é charset e o que é collation?
O charset define o conjunto de caracteres que o banco consegue armazenar. Já a collation define as regras de comparação e ordenação desses caracteres. Por exemplo, duas colunas podem usar utf8mb4 como charset, mas collations diferentes, como utf8mb4_unicode_ci, utf8mb4_general_ci ou utf8mb4_0900_ai_ci.
O problema aparece quando uma consulta tenta comparar colunas com regras diferentes. Isso é comum em sistemas antigos que começaram com latin1, migraram parcialmente para utf8 ou misturam tabelas criadas em momentos diferentes.
Exemplo de erro comum
Imagine uma consulta que compara o e-mail de um usuário com o e-mail de outra tabela:
SELECT u.id, u.email, c.nome
FROM usuarios u
JOIN clientes c ON c.email = u.email;
Se usuarios.email estiver em uma collation e clientes.email estiver em outra, o MySQL pode retornar um erro de comparação. Em outros casos, a consulta até funciona, mas produz ordenações estranhas ou comportamentos inconsistentes em filtros textuais.
Como identificar collations diferentes
O primeiro passo é verificar a configuração das colunas envolvidas. A consulta abaixo lista charset e collation das colunas de uma tabela específica.
SELECT
TABLE_NAME,
COLUMN_NAME,
CHARACTER_SET_NAME,
COLLATION_NAME,
COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'nome_do_banco'
AND TABLE_NAME = 'usuarios'
AND CHARACTER_SET_NAME IS NOT NULL;
Para procurar diferenças em todo o banco, você pode remover o filtro da tabela e ordenar por collation:
SELECT
TABLE_NAME,
COLUMN_NAME,
CHARACTER_SET_NAME,
COLLATION_NAME,
COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'nome_do_banco'
AND CHARACTER_SET_NAME IS NOT NULL
ORDER BY COLLATION_NAME, TABLE_NAME, COLUMN_NAME;
Esse levantamento ajuda a entender se o problema está em uma coluna isolada ou se o banco inteiro foi criado com padrões misturados.
Corrigindo uma coluna específica
Quando o problema está em uma coluna pontual, a correção pode ser feita com ALTER TABLE. Antes de executar qualquer alteração estrutural, faça backup do banco e teste o comando em ambiente de homologação.
ALTER TABLE usuarios
MODIFY email VARCHAR(255)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
NOT NULL;
É importante preservar o tipo da coluna, tamanho, nulidade, valor padrão e índices. Alterar uma coluna sem reproduzir sua definição completa pode causar efeitos colaterais indesejados.
Convertendo uma tabela inteira
Quando a tabela inteira precisa ser padronizada, pode ser usado o comando abaixo. Ele converte as colunas textuais da tabela para o charset e collation definidos.
ALTER TABLE usuarios
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Essa abordagem é prática, mas precisa ser usada com cuidado em tabelas grandes, pois pode bloquear a tabela durante a conversão, dependendo da versão do MySQL, engine e ambiente. Em sistemas de produção, avalie janela de manutenção, backup, replicação e impacto nos usuários.
Qual collation escolher?
Em projetos atuais, o uso de utf8mb4 é recomendado por suportar melhor caracteres especiais, emojis e textos multilíngues. Quanto à collation, a escolha depende da versão do MySQL, compatibilidade com MariaDB e padrão do sistema.
Em bases modernas com MySQL 8, é comum encontrar utf8mb4_0900_ai_ci. Em ambientes que precisam manter compatibilidade ampla, inclusive com MariaDB ou sistemas legados, muitas equipes ainda optam por utf8mb4_unicode_ci. O mais importante é evitar mistura desnecessária entre tabelas que precisam se relacionar.
Também temos um conteúdo complementar sobre migração de charset no artigo Guia prático: convertendo seu MySQL de utf8 para utf8mb4 sem cair em armadilhas.
Correção temporária na query
Em alguns casos emergenciais, é possível forçar a collation em uma comparação específica. Isso pode resolver um erro imediato, mas não substitui a correção estrutural.
SELECT *
FROM usuarios u
JOIN clientes c
ON c.email COLLATE utf8mb4_unicode_ci = u.email COLLATE utf8mb4_unicode_ci;
Essa solução deve ser usada apenas quando não for possível alterar a estrutura do banco naquele momento. O ideal é corrigir a origem do problema para evitar consultas mais complexas, lentas e difíceis de manter.
Conclusão
Erros de collation no MySQL geralmente indicam falta de padronização na estrutura do banco de dados. A correção exige identificar quais colunas estão divergentes, escolher um padrão adequado, testar a alteração e executar a conversão com segurança.
A Saldaris Consultoria atua com diagnóstico de erros em MySQL, MariaDB, sistemas PHP, WordPress, CodeIgniter e aplicações corporativas. Se sua empresa enfrenta erros de comparação, caracteres quebrados ou falhas em consultas SQL, entre em contato pelo formulário abaixo.

