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/ |
+--------------------------+----------------------------+

Kommentar hinterlassen