sql >> Databasteknik >  >> RDS >> Mysql

Att använda utf8 eller inte - MySQL- och PHP-teckenkodningsproblem

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:

  1. SET NAMES latin1;
  2. Välj varje enskilt textfält från varje tabell.
  3. SET NAMES utf8;
  4. 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 .



  1. Hur man cachelagrar Parsed JSON för offlineanvändning

  2. MaxListenersExceededWarning:Möjlig EventEmitter-minnesläcka upptäckt. 11 meddelandelyssnare har lagts till. Använd emitter.setMaxListeners() för att öka gränsen

  3. PDO och MySQL fulltextsökningar

  4. Returnera endast numeriska värden i MariaDB