Kort sagt, för detta har diskuterats tusen gånger tidigare:
- PHP innehåller en sträng, säg
"漢字"
, kodad i UTF-8. Byten för detta ärE6 BC A2 E5 AD 97
. - Den skickar den här strängen över en databasanslutning som är inställd på
latin1
. - Databasen tar emot byten
E6 BC A2 E5 AD 97
, tror att de representerarlatin1
tecken. - Databasen lagrar tecknen
æ¼¢å
(tecken somE6 BC A2 E5 AD 97
mappar tilllatin1
). - Samma process omvänd gör att PHP tar emot samma byte, som det sedan behandlar som UTF-8. Rundturen fungerar bra för PHP, även om databasen inte behandlar tecknen som den ska.
Så problemet här var att databasanslutningen var felaktigt inställd när data matades in i databasen. Du måste konvertera data i databasen till rätt tecken. Prova detta:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Kanske utf8
är inte vad du behöver här, experimentera. Om det fungerar, ändra detta till en UPDATE
uttalande för att uppdatera data permanent.