Em suma, porque isso já foi discutido mil vezes antes:
- PHP contém uma string, digamos
"漢字"
, codificado em UTF-8. Os bytes para isso sãoE6 BC A2 E5 AD 97
. - Ele envia essa string por uma conexão de banco de dados definida como
latin1
. - O banco de dados recebe os bytes
E6 BC A2 E5 AD 97
, pensando que eles representamlatin1
personagens. - O banco de dados armazena os caracteres
æ¼¢å
(os caracteres queE6 BC A2 E5 AD 97
mapeia para emlatin1
). - O mesmo processo invertido faz com que o PHP receba os mesmos bytes, que são tratados como UTF-8. O roundtrip funciona bem para PHP, mesmo que o banco de dados não trate os caracteres como deveria.
Portanto, o problema aqui foi que a conexão do banco de dados foi definida incorretamente quando os dados foram inseridos no banco de dados. Você terá que converter os dados no banco de dados para os caracteres corretos. Tente isto:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Talvez
utf8
não é o que você precisa aqui, experimente. Se isso funcionar, mude para um UPDATE
declaração para atualizar os dados permanentemente.