O que são conjuntos de caracteres e collations no MySQL?
Quando o WordPress armazena o conteúdo do seu site no banco de dados (como posts, títulos, strings traduzidas etc.), ele usa um conjunto de caracteres para representar os caracteres e uma collation para definir como esses caracteres são comparados e ordenados.
- Conjunto de caracteres (Charset)
- Define como os caracteres são armazenados no banco de dados — essencialmente, quais bytes representam quais caracteres.
- Collation
- Define as regras para comparar esses caracteres (por exemplo, diferenciação de maiúsculas e minúsculas, diferenciação de acentos e ordem de classificação).
Por que isso é importante para sites multilíngues
O WPML suporta conteúdo multilíngue, que frequentemente inclui:
- Caracteres especiais (por exemplo, ñ, é, ö)
- Escritas não latinas (por exemplo, árabe, japonês, chinês, hebraico)
- Emojis e símbolos (🎉, ✔️ etc.)
Muitos deles exigem mais de 3 bytes para serem armazenados corretamente. Se o seu banco de dados usar uma collation incompatível, os caracteres poderão ser perdidos, substituídos por , ou gerar erros de banco de dados (por exemplo, “Incorrect string value”).
É por isso que recomendamos fortemente o uso de uma collation que suporte caracteres Unicode de 4 bytes.
Nossa recomendação
Use o conjunto de caracteres utf8mb4 e uma collation compatível com Unicode, como:
- utf8mb4_unicode_ci – amplamente compatível, bom padrão
- utf8mb4_unicode_520_ci – melhor manipulação de Unicode no MySQL 5.6+
- utf8mb4_general_ci – um pouco mais rápido, comparação Unicode menos precisa
- utf8mb4_bin – diferencia maiúsculas de minúsculas e acentos (comparação binária)
Todos esses são seguros para usar com o WPML.
Importante: O antigo conjunto de caracteres utf8 no MySQL suporta apenas até 3 bytes por caractere. Ele não consegue lidar com alguns caracteres, como emojis ou alguns ideogramas. Evite usá-lo para conteúdo multilíngue.
Qual é o padrão no MySQL?
| Versão do MySQL | Charset padrão | Collation padrão | Compatível com Unicode |
|---|---|---|---|
| < 5.5 | latin1 | latin1_swedish_ci | Não |
| 5.5.x | utf8 | utf8_general_ci | Não |
| 5.7+ | utf8mb4 | utf8mb4_general_ci / utf8mb4_unicode_ci | Sim |
| 8.0+ | utf8mb4 | utf8mb4_0900_ai_ci | Sim |
O WordPress pode nem sempre seguir o padrão do MySQL — ele pode substituí-lo por meio de configurações ou migrações.
Como configurar charset e collation para novos sites
Para garantir que o WordPress crie novas tabelas com o conjunto de caracteres e a collation corretos, defina o seguinte no seu wp-config.php:
define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4 define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
Isso se aplicará a novas instalações e tabelas recém-criadas.
Como verificar charset e collation para sites e tabelas existentes
Veja como verificar o conjunto de caracteres e a collation nos seus sites existentes.
Opção 1 phpMyAdmin
- Vá para o banco de dados do seu site.
- Verifique a coluna “Collation” ao lado de cada tabela.
- Clique em uma tabela para visualizar a collation individual de cada coluna.
Opção 2 WP-CLI
bash
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"
Você também pode inspecionar colunas individuais:
bash
wp db query "SHOW FULL COLUMNS FROM wp_posts;"
Se você vir que a collation começa com utf8mb4_, então ela está pronta para suportar todos os tipos de unicode e ideogramas de 4 bytes. O conjunto de caracteres também está correto.
Se você vir algo diferente, por exemplo utf8_*, então você precisará alterá-la.
Observe que a collation pode ser diferente por coluna.
Como atualizar charset e collation para tabelas e colunas existentes
Atualizar as constantes DB_CHARSET e DB_COLLATE no seu arquivo wp-config.php afeta apenas as novas tabelas. Para aplicar alterações a tabelas e colunas existentes, você deve convertê-las manualmente usando SQL.
Também recomendamos atualizar a collation padrão do MySQL do banco de dados usando o seguinte comando:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Sempre comece com um backup
Antes de executar qualquer consulta de conversão:
- Exporte seu banco de dados usando o phpMyAdmin ou o mysqldump
- Armazene-o com segurança caso algo dê errado
Aviso: As atualizações de collation podem falhar no modo estrito
Ao atualizar a collation de uma tabela inteira (ou banco de dados), o MySQL pode reconstruir tabelas e revalidar todos os padrões de coluna — incluindo os não relacionados, como DATETIME. Se o seu banco de dados estiver sendo executado no modo SQL estrito (STRICT_TRANS_TABLES, NO_ZERO_DATE), as colunas com valores padrão como ‘0000-00-00 00:00:00’ acionarão erros como:
#1067 - Invalid default value.
O que é o modo estrito?
O modo estrito controla como o MySQL lida com valores inválidos ou ausentes quando dados são adicionados ou atualizados no banco de dados. Um valor pode ser inválido por vários motivos. Por exemplo, ele pode ter o tipo de dados errado para a coluna ou pode estar fora do intervalo.
Você pode encontrar informações sobre os diferentes tipos de validação de dados para o modo estrito na documentação do MySQL.
Como o modo estrito afeta um banco de dados de site WordPress
Por padrão, o WordPress usa ‘0000-00-00 00:00:00’ como padrão para algumas colunas datetime, o que não é aceito pelo modo estrito NO_ZERO_DATE.
Observe que esses padrões foram permitidos durante a criação original da tabela (por exemplo, durante a configuração do WordPress), mas falham em operações ALTER em ambientes estritos.
Como verificar se o modo estrito está ativado
Execute o seguinte comando:
SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;
Procure por:
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_DATE
Se você encontrar algum desses, o modo estrito está ativado.
Para evitar erros durante as atualizações de conjunto de caracteres e collation, você só precisa desativar o modo estrito NO_ZERO_DATE.
Como proceder com segurança
Faça uma das seguintes opções para proceder com segurança:
1. Evite alterar colunas e tabelas a menos que a collation realmente precise ser alterada.
2. Desative temporariamente o modo estrito apenas para a sessão enquanto executa consultas de conversão. Você pode fazer isso usando o seguinte comando:
SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');
Observação: existem planos futuros para o MySQL mesclar os modos estritos.
No caso de outros problemas específicos dos seus dados, você pode querer desativar qualquer modo estrito usando o seguinte comando:
SET SESSION sql_mode = '';
Consultas para conversão de dados
Converta todo o banco de dados
O seguinte gera uma consulta ALTER TABLE para cada tabela no seu banco de dados:
SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) AS query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
Execute as consultas resultantes no phpMyAdmin ou copie e cole na CLI do MySQL / WP-CLI.
Isso garante que todas as tabelas no seu banco de dados adotem o novo charset e collation.
Converta uma tabela específica Opcional/Acessório
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Isso atualiza todas as colunas de texto na tabela wp_posts para usar utf8mb4 e a collation especificada.
Converta uma coluna específica Opcional/Acessório
ALTER TABLE wp_posts CHANGE post_title post_title TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Observação:
- Você deve re-declarar totalmente a coluna (tipo, nome) em CHANGE.
- Certifique-se de que o tipo de coluna corresponda ao existente.
Erros comuns ao converter
Aqui estão dois erros comuns que você pode encontrar ao converter tabelas e colunas.
Charset e collation incompatíveis
-- INVALID: utf8 collation with utf8mb4 charset ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci; -- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
Solução:
- Use uma collation correspondente: utf8mb4_*
Limite de comprimento da chave de índice
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Em algumas configurações, especialmente para versões do MySQL inferiores a 5.7, o comprimento máximo da chave de índice pode ser excedido ao adicionar mais um byte por caractere.
Solução:
- Encurte o VARCHAR(255) indexado para VARCHAR(191), se necessário
- Ou faça o upgrade para o MySQL 5.7+ e certifique-se de que innodb_large_prefix esteja ativado
Resumo
- Use o conjunto de caracteres utf8mb4 para suporte total a Unicode
- Use collations compatíveis: utf8mb4_unicode_ci, utf8mb4_0900_ai_ci etc.
- Atualize o wp-config.php para novas tabelas
- Execute migrações SQL para corrigir tabelas existentes
- Nunca misture conjuntos de caracteres e collations — o MySQL os rejeitará ou os corromperá.