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ílatin1
znaky. - V databázi jsou uloženy znaky
æ¼¢å
(znaky, kteréE6 BC A2 E5 AD 97
mapuje 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.