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.

Come importare un intero database con MySQL

Dopo aver visto come esportare un intero db con mysqldump, mi sembra logico spiegarvi come importarlo. Loggatevi prima con l’utente root:

sudo mysql -u root -p

Create un nuovo db chiamato new con:

create database new;

Poi uscite eseguendo un exit (poi premete invio). Presupponendo che ora siete nel path giusto (e che il file esportato sia dbs.sql come nell’altra guida), eseguite:

sudo mysql -u root -p new < dbs.sql

Mi raccomando aspettate che finisca tutto prima di chiudere o cambiare operazione… è un’operazione alquanto rischiosa!

Come esportare un intero database su MySQL

In qualche articolo precedente avevamo visto come fare un backup con uno script Bash, ora vediamo più semplicemente come esportare un intero db di MySQL con una riga di codice:

sudo mysqldump -u root -p -x -A > /home/user/dbs.sql

Dovrete cambiare l’user root, nel caso non abbiate quell’utente come amministratore con i privilegi. E anche il path con il vostro utente invece di user.

Questo sappiate che vi esporterà tutti i database contenuti al suo interno, compresi quelli di sistema o quelli di phpMyAdmin.