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æsentererlatin1
tegn. - Databasen gemmer tegnene
æ¼¢å
(de tegn, derE6 BC A2 E5 AD 97
kort 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.