Mettere a posto l’encoding di Mysql dopo una migrazione
Recentemente ho spostato questo blog su un nuovo provider; nel farlo ho trasferito i dati da una vecchissima installazione di Mysql 3.23 a un ragionevole Mysql 5.x. Purtroppo l’encoding del database si era rovinato; tutte le accentate apparivano come punti di domanda. Quello che era successo è che il vecchio Mysql usava l’encoding iso8859-1 (ovvero latin1), ma non lo dichiarava esplicitamente nel mysqldump. Caricandolo sul nuovo Mysql, senza dichiarare l’encoding, il testo è stato caricato assumendo utf-8. Quindi il database pensava di contenere testo codificato in utf-8, ma non era vero.
Per riparare la situazione, ho dovuto dare:
ALTER TABLE wp_posts MODIFY post_content blob;
che dichiara la colonna come dati binari; poi
ALTER TABLE wp_posts MODIFY post_content text charset latin1;
che la dichiara come testo con encoding latin1. Non potevo dare subito quest’ultimo comando, perché Mysql avrebbe allora cercato di trascodificare erroneamente. Infine ho dato l’encoding desiderato con il comando
ALTER TABLE wp_posts MODIFY post_content text charset utf8;
che la trasforma in utf-8.
Ebbene sì, questo post serve solo per ricordarmi di questi comandi se ne dovessi avere mai ancora bisogno. Altre risorse:
- la pagina su cui ho trovato queste informazioni
- Il minimo assoluto che tutti i programmatori devono sapere su Unicode
Per sapere il charset del database corrente si può usare
show variables like "character_set_database";
show variables like "collation_database";
oppure
SHOW CREATE DATABASE `DB_NAME`