Ditt problem är att din SET NAMES 'utf8_persian_ci'
kommandot var ogiltigt (utf8_persion_ci är en sortering , inte en kodning ). Om du kör det i en terminal kommer du att se ett felmeddelande Unknown character set: 'utf8_persian_ci'
. Alltså din applikation, när den lagrades data, använde latin1
teckenuppsättning. MySQL tolkade din inmatning som latin1-tecken som den sedan lagrade kodad som utf-8. Likaså när data drogs tillbaka, konverterade MySQL den från UTF-8 tillbaka till latin1 och (förhoppningsvis, för det mesta) de ursprungliga byten du gav den.
Med andra ord, all din data i databasen är helt förstörd, men det råkade bara fungera.
För att fixa detta måste du ångra det du gjorde. Det enklaste sättet är att använda PHP:
SET NAMES latin1;
- Välj varje enskilt textfält från varje tabell.
SET NAMES utf8;
- Uppdatera samma rader med samma sträng oförändrad.
Alternativt kan du utföra dessa steg i MySQL, men det är knepigt eftersom MySQL förstår att data finns i en viss teckenuppsättning. Du måste ändra dina textkolumner till en BLOB-typ och sedan ändra dem tillbaka till texttyper med en utf8-teckenuppsättning. Se avsnittet längst ned i ALTER TABLE
MySQL-dokumentation märkt "Varning" i rött
.
När du har gjort någon av dessa saker kommer byten som lagras i dina databaskolumner att vara den faktiska teckenuppsättningen de påstår sig vara. Sedan se till att du alltid använder mysql_set_charset('utf8')
på någon databasåtkomst från PHP som du kan göra i framtiden! Annars kommer du att förstöra saker igen. (Obs, använd inte en enkel mysql_query('SET NAMES utf8')
! Det finns hörnfall (som en återställningsanslutning) där denna kan återställas till latin1
utan din vetskap. mysql_set_charset()
kommer att ställa in teckenuppsättningen när det behövs.)
Det skulle vara bäst om du bytte bort från mysql_*
funktioner och använd PDO
istället med charset=utf8
parameter i din PDO dsn
.