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
.