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

At bruge utf8 eller ej - MySQL- og PHP-tegnkodningsproblem

Dit problem er, at din SET NAMES 'utf8_persian_ci' kommandoen var ugyldig (utf8_persion_ci er en sortering , ikke en kodning ). Hvis du kører det i en terminal, vil du se fejlen Unknown character set: 'utf8_persian_ci' . Således din applikation, når den gemte dataene brugte latin1 tegnsæt. MySQL fortolkede dit input som latin1-tegn, som det derefter gemte kodet som utf-8. På samme måde, da dataene blev trukket ud, konverterede MySQL dem fra UTF-8 tilbage til latin1 og (forhåbentlig, det meste af tiden) de originale bytes, du gav dem.

Med andre ord er alle dine data i databasen fuldstændig rodet, men det virkede tilfældigvis.

For at rette dette skal du fortryde det, du gjorde. Den mest ligetil måde er at bruge PHP:

  1. SET NAMES latin1;
  2. Vælg hvert enkelt tekstfelt fra hver tabel.
  3. SET NAMES utf8;
  4. Opdater de samme rækker med den samme streng uændret.

Alternativt kan du udføre disse trin inde i MySQL, men det er vanskeligt, fordi MySQL forstår, at data er i et bestemt tegnsæt. Du skal ændre dine tekstkolonner til en BLOB-type og derefter ændre dem tilbage til teksttyper med et utf8-tegnsæt. Se afsnittet nederst i ALTER TABLE MySQL-dokumentation mærket "Advarsel" i rødt .

Når du har gjort en af ​​disse ting, vil de bytes, der er gemt i dine databasekolonner, være det faktiske tegnsæt, de hævder at være. Så sørg for, at du altid bruger mysql_set_charset('utf8') på enhver databaseadgang fra PHP, som du måtte gøre i fremtiden! Ellers roder du tingene sammen igen. (Bemærk, brug ikke en simpel mysql_query('SET NAMES utf8') ! Der er hjørnetilfælde (såsom en nulstillingsforbindelse), hvor denne kan nulstilles til latin1 uden din viden. mysql_set_charset() indstiller tegnsættet, når det er nødvendigt.)

Det ville være bedst, hvis du skiftede fra mysql_* funktioner og brugte PDO i stedet med charset=utf8 parameter i din PDO dsn .



  1. Oracle Date TO_CHAR('Month DD, YYYY') har ekstra mellemrum i sig

  2. En introduktion til MySQL-implementering ved hjælp af en Ansible-rolle

  3. JDBC med MySQL virkelig langsom, ved ikke hvorfor

  4. Fjern dubletter fra Count()-resultater i SQLite