Como o problema aparece
Antes
INSERT INTO wp_posts (post_title) VALUES ('Promoção – ação de verão');Depois
INSERT INTO wp_posts (post_title) VALUES ('Promoção – ação de verão');De onde vem
O WordPress guarda texto como UTF-8. Muitas instalações antigas, porém, criaram as tabelas em latin1 ou se conectaram com latin1. Enquanto a gravação e a leitura cometem o mesmo erro, ninguém percebe. Depois de mudar para um servidor novo, exportar pelo phpMyAdmin ou alterar o conjunto de caracteres da conexão, cada letra acentuada vira de repente dois caracteres.
DB_CHARSETnowp-config.phpélatin1ou não combina com as tabelas.- O dump foi exportado como
latin1e importado comoutf8mb4– ou o contrário. - Um plugin ou script de importação converteu mais uma vez um texto já quebrado. Daí surge texto com dupla codificação como
ç.
Corrigir a exportação
- Faça um backup do banco de dados antes de mudar qualquer coisa.
- Exporte as tabelas afetadas como arquivo
.sql, por exemplo pelo phpMyAdmin ou commysqldump --default-character-set=utf8mb4. - Solte o arquivo na caixa acima. O Mojibuster corrige só os trechos quebrados e mostra cada alteração.
- Baixe o arquivo corrigido e importe-o com
utf8mb4num banco de dados de teste novo. - Confira o site. Se tudo estiver certo, importe no banco de dados de produção.
O dump nunca é enviado a nenhum servidor – o que importa, pois ele costuma conter contas de usuários, e-mails e comentários. Mais sobre isso para empresas e encarregados de proteção de dados.
Cuidado com dados serializados
O WordPress guarda algumas configurações em wp_options e wp_postmeta como valores PHP serializados, como s:6:"Ação";. O número é o tamanho em bytes. Quando ç volta a ser ç, o tamanho deixa de bater e o WordPress descarta o valor. Por isso, corrija primeiro as tabelas de conteúdo como wp_posts, wp_comments e wp_terms. Para as opções, o wp search-replace do WP-CLI é a ferramenta melhor, porque atualiza os tamanhos.
Resolver a causa no MySQL
- Mude tabelas e conexão para
utf8mb4e definadefine('DB_CHARSET', 'utf8mb4');nowp-config.php. - Se uma coluna
latin1guarda bytes UTF-8, não a converta diretamente – isso a codificaria uma segunda vez. O caminho usual passa por um tipo binário: primeiroMODIFY … LONGBLOB, depoisMODIFY … LONGTEXT CHARACTER SET utf8mb4. - Teste cada alteração antes numa cópia do banco de dados.
Perguntas frequentes
Posso corrigir um banco de dados WordPress inteiro de uma vez?
Sim, mesmo dumps SQL grandes. Atenção, porém, aos dados serializados em wp_options e wp_postmeta – o WP-CLI lida melhor com eles.
Caracteres corretos do dump serão alterados?
Não. O Mojibuster só corrige sequências claramente quebradas. O texto correto fica como está.
Qual a diferença entre utf8 e utf8mb4?
No MySQL, utf8 só guarda caracteres de até três bytes, então emojis se perdem. utf8mb4 é UTF-8 de verdade e a escolha certa para o WordPress.
Funciona com sistemas além do WordPress?
Sim. Joomla, Drupal, Magento ou a sua própria aplicação em MySQL ou MariaDB têm o mesmo problema e a mesma solução.