Rieccomi qua a scontrarmi con un problema che mi era già capitato un paio di anni fa.
In sintesi, devo migrare un intero db da mysql 4.0 a mysql 5.x. Ora, il problema è che mysql 4.0 non supportava utf8 e tutti i campi contenenti caratteri (varchar, char, text, etc) avevano una codifica iso-8859-1 (volgarmente detta latin1).
Il problema è molto diffuso, nel senso che in rete c'è molta documentazione e molti articoli che ne parlano, nessuno dei quali però mi ha risolto il problema. Sto quindi cercando la mia strada verso la luce.
Vediamo un attimo cosa mi succede, ed i passi che sto seguendo per effettuare questa procedura.
PASSO 1
Esporto il database con mysqldump in formato latin1
PASSO 2codice:mysqldump -u user -p --default-character-set=latin1 database tabella > /path/to/dump/dump.sql
Apro il dump con un editor di testo (PSPAD) e controllo che formato ha il file.
Sembra avere davvero la codifica con cui lo ho esportato: supponiamo che il dump sia composto da questa linea.
Editandolo in modalità esadecimale vedo che effettivamente i caratteri sembrano codificati correttamente, in particolare: la "è" è codificata dal byte E8, la "ò" dal byte F2.codice:insert into tab values ('La vita è una cosa meravigliòsa');
PASSO 3
Converto il dump utilizzando iconv.
PASSO 4codice:iconv -f latin1 -t UTF-8 /path/to/dump/dump.sql > /path/to/dump/dump.utf8.sql
Come al passo due, do una controllata alla codifica del file. La conversione sembra avvenuta
correttamente, in particolare il carattere "è" è codificato come 0xE8.
PASSO 5
Importo il dump in mysql5, che utilizza come codifica default per *tutto* (client, connessione, db, etc) utf8.
PASSO 6codice:mysql -u root -p localhost database_nuovo < /path/to/dump/dump.utf8.sql
Verifico. Apro il browser e lancio l'applicazione. I caratteri incriminati (in questo caso "è" e "ò") sono visualizzati rispettivamente come Atilde e qualcosaltro che non mi ricordo piu.
Vado a controllare le tabelle di codifica utf8 (http://kellyjones.netfirms.com/webto...f8_table.shtml) e mi accorgo che c'è qualcosa di importante che mi sfugge:
Il carattere "è" ha una codifica esadecimale che è 0xE8, mentre la codifica UTF8 è 0xC3,0xA8. Continuo a cercare e scopro che la fottuta Atilde ( Ã ) che mi rimpiazza le "è" guarda caso ha una codifica binaria di 0xC3 e 0xC3,0x83 in UTF8.
Questo sembra dimostrare palesemente che al momento dell'import mysql ha fatto una conversione trasformando il mio 0XE8 in un bel 0xC3 (questo è solo l'esempio della "è", la cosa avviene praticamente per tutto ciò che non è alfanumerico o segno di interpunzione principale).
Prima domanda: che conversione fa mysql?
Seconda domanda: ma che cavolo vuol dire che la codifica della "è" utf8 è 0xC3,0xA8!? Voglio dire, in memoria che diavolo c'è scritto: E8 o C3?

Rispondi quotando