sql >> Database teknologi >  >> RDS >> Mysql

mærkelig tegnkodning af lagrede data, gammelt script viser dem fint, nyt gør det ikke

Kort sagt, fordi dette er blevet diskuteret tusinde gange før:

  1. PHP indeholder en streng, sig "漢字" , kodet i UTF-8. Bytene for dette er E6 BC A2 E5 AD 97 .
  2. Den sender denne streng over en databaseforbindelse, som er indstillet til latin1 .
  3. Databasen modtager bytes E6 BC A2 E5 AD 97 , og tænker, at de repræsenterer latin1 tegn.
  4. Databasen gemmer tegnene æ¼¢å­ (de tegn, der E6 BC A2 E5 AD 97 kort til i latin1 ).
  5. 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.



  1. postgresql - antal (ingen null-værdier) af hver kolonne i en tabel

  2. Migrering af en MySQL-database fra CloudSQL til AWS RDS

  3. Problemer med sammenligning af MySQL flydende komma

  4. Hvordan returnerer man flere værdier i én kolonne (T-SQL)?