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

Per utilizzare utf8 o meno - Problema di codifica dei caratteri MySQL e PHP

Il tuo problema è che il tuo SET NAMES 'utf8_persian_ci' comando era non valido (utf8_persion_ci è una collation , non una codifica ). Se lo esegui in un terminale vedrai un errore Unknown character set: 'utf8_persian_ci' . Così la tua applicazione, quando memorizzata i dati stavano usando latin1 set di caratteri. MySQL ha interpretato il tuo input come caratteri latin1 che ha quindi archiviato codificati come utf-8. Allo stesso modo, quando i dati sono stati estratti, MySQL li ha riconvertiti da UTF-8 a latin1 e (si spera, la maggior parte delle volte) i byte originali che gli hai fornito.

In altre parole, tutti i tuoi dati nel database sono completamente incasinati, ma è successo che funzionasse.

Per risolvere questo problema, devi annullare ciò che hai fatto. Il modo più semplice è usare PHP:

  1. SET NAMES latin1;
  2. Seleziona ogni singolo campo di testo da ogni tabella.
  3. SET NAMES utf8;
  4. Aggiorna le stesse righe utilizzando la stessa stringa inalterata.

In alternativa puoi eseguire questi passaggi all'interno di MySQL, ma è complicato perché MySQL comprende che i dati si trovano in un determinato set di caratteri. Devi modificare le colonne di testo in un tipo BLOB, quindi modificarle indietro ai tipi di testo con un set di caratteri utf8. Vedi la sezione in fondo alla ALTER TABLE Documentazione MySQL con l'etichetta "Attenzione" in rosso .

Dopo aver eseguito una di queste operazioni, i byte archiviati nelle colonne del database saranno il set di caratteri effettivo che affermano di essere. Quindi, assicurati di utilizzare sempre mysql_set_charset('utf8') su qualsiasi accesso al database da PHP che potresti fare in futuro! Altrimenti rovinerai di nuovo le cose. (Nota, non utilizzare un semplice mysql_query('SET NAMES utf8') ! Ci sono casi limite (come un ripristino della connessione) in cui questo può essere reimpostato su latin1 a tua insaputa. mysql_set_charset() imposterà il set di caratteri quando necessario.)

Sarebbe meglio se abbandonassi mysql_* funzioni e utilizzato PDO invece con charset=utf8 parametro nel tuo DSN PDO .