WPML

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 MySQLCharset padrãoCollation padrãoCompatível com Unicode
< 5.5latin1latin1_swedish_ciNão
5.5.xutf8utf8_general_ciNão
5.7+utf8mb4utf8mb4_general_ci / utf8mb4_unicode_ciSim
8.0+utf8mb4utf8mb4_0900_ai_ciSim

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

  1. Vá para o banco de dados do seu site.
  2. Verifique a coluna “Collation” ao lado de cada tabela.
  3. 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á.