Acertar a codificação é realmente complicado - existem muitas camadas:
- Navegador
- Página
- PHP
- MySQL
O comando SQL "SET CHARSET utf8" do PHP irá garantir que o lado do cliente (PHP) irá obter os dados em utf8, não importa como eles estão armazenados no banco de dados. Claro, eles precisam ser armazenados corretamente primeiro.
Definição DDL vs. dados reais
A codificação definida para uma tabela / coluna não significa realmente que os dados estão nessa codificação. Se por acaso você tiver uma tabela definida como, utf8
mas armazenada com codificação diferente, o MySQL irá tratá-la como utf8
e você terá problemas. O que significa que você tem que consertar isso primeiro.
O que verificar
Você precisa verificar em qual codificação o fluxo de dados em cada camada.
- Verifique os cabeçalhos HTTP, cabeçalhos.
- Verifique o que realmente foi enviado no corpo da solicitação.
- Não se esqueça de que o MySQL possui codificação em quase todos os lugares:
- Base de dados
- Mesas
- Colunas
- Servidor como um todo
- Cliente
Certifique-se de que haja o correto em todos os lugares.
Conversão
Se você receber dados, por exemplo windows-1250
, e quiser armazenar utf-8
, use este SQL antes de armazenar:
SET NAMES 'cp1250';
Se você tem dados no banco de dados windows-1250
e deseja recuperá-los utf8
, use:
SET CHARSET 'utf8';
Mais algumas notas:
- Não confie em ferramentas muito "inteligentes" para mostrar os dados. Por exemplo, phpMyAdmin faz (fazia quando eu o estava usando) a codificação muito ruim. E passa por todas as camadas, então é difícil descobrir.
- Além disso, o Internet Explorer tinha um comportamento realmente estúpido de "adivinhar" a codificação com base em regras estranhas.
- Use editores simples onde você pode alternar a codificação. Eu recomendo o MySQL Workbench.