Como eu corrigi a codificação do banco de dados em uma migração?

Quem trabalha com TI já tá acostumado: todo dia tem um problema novo que exige uma solução nova (não tem um dia que eu passo sem pesquisar algo no Google que vá me ajudar a resolver algum problema técnico). Isso, na verdade, é motivador, pois sempre estamos em movimento, aprendendo coisas novas.

No texto de hoje vou explicar resumidamente o que eu fiz para corrigir uma codificação errada em um processo de migração.

A codificação

A codificação pode ser entendida como o conjunto de caracteres que aquela aplicação vai utilizar. Frequentemente isso é usado em sistemas de bancos de dados. Por exemplo atualmente utiliza-se muito o UTF-8, que serve para padronizar os sistemas (caso contrário teríamos vários problemas para converter caracteres, por exemplo).

Quando uma codificação não é a ideal para aquele ambiente (navegador, por exemplo), os caracteres especiais (palavras acentuadas na maioria das vezes – ã, ô, é…) são substituídos por um código que os representa.

O código ‘ç’ representa o ‘ç’.

A migração

Frequentemente tenho que fazer a migração de sites entre dois ambientes. De um servidor para outro, de um diretório para outro etc. Na maioria das vezes eu faço isso entre dois sistemas já em WordPress, o que fica muito mais fácil. Porém ás vezes ocorre de um sistema não estar em WordPress, daí é necessário eu adaptá-lo antes de migrar. Foi o que ocorreu aqui.

O Problema

Em 2018 foi necessário implantar o WordPress em um site de um cliente,  que possuía um sistema construído apenas para ele, ou seja, não é um  CMS[1] e não é nenhuma biblioteca/framework/script pronto. O analista contratado simplesmente desenvolveu do zero o site para a pessoa.

O site foi desenvolvido em PHP, com JS e banco MySQL. O fato de o banco ser MySQL facilitou bastante por eu já ser familiarizado e poder acessar acesso via PhpMyAdmin[2].

Teoricamente eu teria que migrar os dados do sistema legado para o WordPress, fazendo a correção da codificação de acentos, cedilha e afins. Isso foi necessário pois, no sistema legado, a codificação (já explicada acima) substituiu os caracteres por alguma razão desconhecida.

A Solução

1. Acessar PhpMyAdmin origem

Neste passo é necessário ter acesso ao servidor do ambiente de origem, com credenciais (usuário e senha) e permissões no banco de dados.

1.a – Através da interface do PhpMyAdmin, exportar a tabela de posts (tabela_noticias) em formato CSV para Excel (existe o formato somente CSV, mas o que funcionou foi o CSV para Excel).

2. Acessar WordPress do site destino

Naturalmente o novo ambiente já deve estar devidamente instalado e configurado.

2.a Instalar o plugin WP All Import[3];
2.b Seguir o passo-a-passo do plugin, que é bem intuitivo, para importar os dados obtidos no Passo 1.

3. Converter caracteres problemáticos

3.a O site origem já possuía codificação errada (não aparecia cedilha, til, etc, apenas caracteres decodificados);
3.b  – O que deve ser feito é fazer a correção via SQL, com o script  abaixo. O script pode (deve!) ser personalizado de acordo com  as necessidades que surgirem (novos caracteres, etc.). É importante  destacar que o termo a ser substituído deve ser buscado na tabela do  WordPress (ou direto no Painel->Todos os posts) e não no arquivo CSV exportado, visto que são codificações diferentes!). No caso abaixo, ‘tb7’ é o prefixo utilizado pelo WordPress.

 

UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘çã’, ‘çã’),
`post_excerpt` = replace(post_excerpt, ‘çã’, ‘çã’),
`post_content` = replace(post_content, ‘çã’, ‘çã’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ç’, ‘ç’),
`post_excerpt` = replace(post_excerpt, ‘ç’, ‘ç’),
`post_content` = replace(post_content, ‘ç’, ‘ç’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ó’, ‘ó’),
`post_excerpt` = replace(post_excerpt, ‘ó’, ‘ó’),
`post_content` = replace(post_content, ‘ó’, ‘ó’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘á’, ‘á’),
`post_excerpt` = replace(post_excerpt, ‘á’, ‘á’),
`post_content` = replace(post_content, ‘á’, ‘á’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ã’, ‘ã’),
`post_excerpt` = replace(post_excerpt, ‘ã’, ‘ã’),
`post_content` = replace(post_content, ‘ã’, ‘ã’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘é’, ‘é’),
`post_excerpt` = replace(post_excerpt, ‘é’, ‘é’),
`post_content` = replace(post_content, ‘é’, ‘é’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ô’, ‘ô’),
`post_excerpt` = replace(post_excerpt, ‘ô’, ‘ô’),
`post_content` = replace(post_content, ‘ô’, ‘ô’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ê’, ‘ê’),
`post_excerpt` = replace(post_excerpt, ‘ê’, ‘ê’),
`post_content` = replace(post_content, ‘ê’, ‘ê’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘ú’, ‘ú’),
`post_excerpt` = replace(post_excerpt, ‘ú’, ‘ú’),
`post_content` = replace(post_content, ‘ú’, ‘ú’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘â’, ‘â’),
`post_excerpt` = replace(post_excerpt, ‘â’, ‘â’),
`post_content` = replace(post_content, ‘â’, ‘â’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘Ã’, ‘í’),
`post_excerpt` = replace(post_excerpt, ‘Ã’, ‘í’),
`post_content` = replace(post_content, ‘Ã’, ‘í’);
UPDATE
`tb7_posts`
SET
`post_title` = replace(post_title, ‘º’, ‘º’),
`post_excerpt` = replace(post_excerpt, ‘º’, ‘º’),
`post_content` = replace(post_content, ‘º’, ‘º’);

O script acima faz a substituição dos caracteres e deixa as postagens com o texto bonitinho 🙂

Dúvidas? Deixe aqui nos comentários. Será um prazer te ajudar.

Links & Referências

[1] CMS: Content Management System: Sistema Gerenciador de Conteúdo – WordPress, Drupal, Joomla. são exemplos de CMS`s.

[2] PHPMyAdmin é um sistema gestor de bancos de dados MySQL desenvolvido em PHP e que pode ser executado diretamente no navegador. É um dos serviços mais comuns em hospedagens web.

[3] Plugin que permite a importação facilitada de algumas informações (posts, por exemplo): https://www.wpallimport.com/