Zkrátka proto, že už se to tu probíralo tisíckrát:
- PHP obsahuje řetězec, řekněte
"漢字", kódované v UTF-8. Tyto bajty jsouE6 BC A2 E5 AD 97. - Odešle tento řetězec přes databázové připojení, které je nastaveno na
latin1. - Databáze přijímá bajty
E6 BC A2 E5 AD 97, myslet si, že představujílatin1znaky. - V databázi jsou uloženy znaky
æ¼¢å(znaky, kteréE6 BC A2 E5 AD 97mapuje na vlatin1). - Stejný proces obrácený způsobí, že PHP obdrží stejné bajty, které pak považuje za UTF-8. Zpáteční cesta funguje dobře pro PHP, i když databáze nezachází se znaky tak, jak by měla.
Problém zde tedy byl, že při zadávání dat do databáze bylo špatně nastaveno připojení k databázi. Budete muset převést data v databázi na správné znaky. Zkuste toto:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Možná utf8 není to, co zde potřebujete, experimentujte. Pokud to funguje, změňte to na UPDATE prohlášení k trvalé aktualizaci dat.