Come esportare un db in latin 1 ed importare in utf8 su MySQL

Come spiegato anche in questa guida su come convertire un database da latin 1 a utf8, le chance di successo non sono granché e dipende molto dalla tipologia di database, dalla complessità (quindi anche dal sistema che state utilizzando) e dalla mole di dati che avete da convertire.

Un’altra tecnica può essere quella di esportare il db e di reimportarlo con una codifica diversa. Vediamo come fare…

Come al solito ho supposto che il database si chiami dbname, l’utente con permessi si chiami root e che abbia come password password. I quattro comandi da eseguire sono i seguenti (tutti eseguiti come amministratore):

sudo su

mysqldump --user=root --password=password --default-character-set=latin1 --skip-set-charset dbname > dump.sql

sed -r 's/latin1/utf8/g' dump.sql > dump_utf.sql

mysql --user=root --password=password --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;"

mysql --user=root --password=password --default-character-set=utf8 dbname < dump_utf.sql

Mi ripeto nel dirvi che la probabilità che questo funzioni non è altissima ma dipende sempre da caso a caso, voi effettuate comunque un backup di tutto.

Come convertire un intero database da latin1 a utf8

Facendola semplice: presupponiamo che il vostro db si chiami dbname ed è codificato come latin1 ma voi volete convertirlo in utf8 in quanto è ovviamente compatibile con più caratteri, le due query in questione sono:

SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "dbname";

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

Se poi volete provare (mi raccomando fate un backup di tutto) a convertire ogni singola tabella… beh ecco a voi questo bello script:

sudo mysql -u root -p --database=dbname -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql -u root -p --database=dbname

C’è una bella probabilità che non funzioni e che vi riporti errore o rimanga fermo. Nel caso stoppatelo con il solito ctrl+c e provate in qualche altro modo ad effettuare la conversione.