Kort sagt, fordi dette er blevet diskuteret tusinde gange før:
- PHP indeholder en streng, sig
"漢字", kodet i UTF-8. Bytene for dette erE6 BC A2 E5 AD 97. - Den sender denne streng over en databaseforbindelse, som er indstillet til
latin1. - Databasen modtager bytes
E6 BC A2 E5 AD 97, og tænker, at de repræsentererlatin1tegn. - Databasen gemmer tegnene
æ¼¢å(de tegn, derE6 BC A2 E5 AD 97kort til ilatin1). - Den samme proces omvendt får PHP til at modtage de samme bytes, som den så behandler som UTF-8. Rundturen fungerer fint for PHP, selvom databasen ikke behandler tegnene, som den skal.
Så problemet her var, at databaseforbindelsen var indstillet forkert, da dataene blev indtastet i databasen. Du bliver nødt til at konvertere dataene i databasen til de korrekte tegn. Prøv dette:
SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name
Måske utf8 er det ikke hvad du har brug for her, eksperiment. Hvis det virker, skal du ændre dette til en UPDATE erklæring for at opdatere dataene permanent.