Alternativer Weg über MySQL-Dump
Zunächst werden die Daten in eine Datei gedumpt:
mysqldump -h beispiel.org --user=foo -p --default-character-set=latin1 -c \ --insert-ignore --skip-set-charset -r dump.sql dbname
User,host und Datenbankname müssen natürlich noch durch die richtigen Verbindungsdaten ersetzt werden.
Mit dem folgenden Kommando kann das Character-Set überprüft werden.
file dump.sql
Wenn die Datei bereits im UTF-8-Format ist, kann der folgende Schritt übersprungen werden. Sonst werden jetzt die Zeichen des MySQL-Dump von latin1 in UTF-8 konvertiert.
iconv -f ISO8859-1 -t UTF-8 dump.sql > dump_utf8.sql
Wenn nach der Konvertierung die Umlaute korrekt, aber ß, € … defekt sind, funktioniert es vielleicht besser, wenn im iconv-Kommando statt der Kodierung -f ISO8859-1 die Kodierung -f ISO8859-1 gewählt wird.
Als nächstes ersetzen wir die Vorkommnisse von „CHARSET=latin1“ durch den UTF-8-Characterset.
perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump_utf8.sql
Darüberhinaus kann es noche einige Stellen, z.B. in den Spaltendefinitionen, geben, an denen latin1 vorkommt. Diese müssen auch noch entsprechend ersetzt werden
Jetzt kann die alte Datenbank gelöscht werden und eine neue mit utf8 Support erzeugt werden.
mysql --user=foo -p --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;"
Die konvertierten Daten werden jetzt noch importiert.
mysql --user=foo --max_allowed_packet=16M -p --default-character-set=utf8 dbname < dump_utf8.sql
To set the defaults:
SHOW VARIABLES LIKE 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+
SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Mostly you find the config in /etc/mysql/my.cnf
[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
[client]
default-character-set=utf8
service mysql restart
mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+