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:
SET NAMES latin1;
- Vælg hvert enkelt tekstfelt fra hver tabel.
SET NAMES utf8;
- 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
.