WordPress e exportações de banco de dados: ç e ’ em vez de ç e ’

Depois de uma migração, atualização ou exportação do banco de dados, seus posts mostram de repente ç em vez de ç e ’ em vez de ’? Quase sempre os dados continuam lá – só estão sendo lidos com a codificação errada. O Mojibuster corrige a exportação; depois você resolve a causa no banco de dados.

Funciona com texto e com estes arquivos:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Por exemplo exportações do Excel, backups de bancos de dados, legendas ou código de sites.

Corrigir

  1. Solte um arquivo ou cole o texto
  2. A correção é automática
  3. Copie ou baixe
ou simplesmente arraste um arquivo para cá

Como o problema aparece

Uma linha de um dump SQL após a troca de servidor

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_CHARSET no wp-config.php é latin1 ou não combina com as tabelas.
  • O dump foi exportado como latin1 e importado como utf8mb4 – 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

  1. Faça um backup do banco de dados antes de mudar qualquer coisa.
  2. Exporte as tabelas afetadas como arquivo .sql, por exemplo pelo phpMyAdmin ou com mysqldump --default-character-set=utf8mb4.
  3. Solte o arquivo na caixa acima. O Mojibuster corrige só os trechos quebrados e mostra cada alteração.
  4. Baixe o arquivo corrigido e importe-o com utf8mb4 num banco de dados de teste novo.
  5. 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 utf8mb4 e defina define('DB_CHARSET', 'utf8mb4'); no wp-config.php.
  • Se uma coluna latin1 guarda bytes UTF-8, não a converta diretamente – isso a codificaria uma segunda vez. O caminho usual passa por um tipo binário: primeiro MODIFY … LONGBLOB, depois MODIFY … 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.

Mais guias