Für die Umstellung meiner WordPress Datenbank von Latin1 auf UTF-8 habe ich den Weg des bearbeiteten SQL-Dumpes gewählt. Es ist keine Einklick-Lösung. Zwar gibt es auch einige entsprechende Plugins, doch liest man da teilweise widersprüchliches über den Erfolg der Konvertierung und so hab ich auch eine direktere Kontrolle.

Kurz gesagt:

  1. Datenbanksicherung (SQL-Dump) erstellen
  2. SQL-Dump im Editor öffnen und CHARSET=latin1 mit utf8 ersetzen
  3. Sonderzeichen wie ÄäÖ ersetzen
  4. Bearbeiteten SQL-Dump speichern (utf-8) und wieder einspielen
  5. UTF-8 in der WordPresskonfig aktivieren

Bevor ihr anfangt an der Datenbank herumzuwerkeln, hebt eine Sicherung auf, um jederzeit wieder zu Eurem alten Datenbankstand zurückkehren zu können, denn ich übernehme natürlich keine Verantwortung, dass meine Anleitung der Weisheit letzter Schluss ist. Mit SQL-Dump meine ich eine Datenbanksicherung als SQL-Statements. So, nun aber ab zu meiner Herangehensweise:

1. Datenbanksicherung (SQL-Dump)er stellen

Eine Sicherung Eurer Datenbank erstellen, sei es per Terminalbefehl mysqldump oder Tools wie PHPMyAdmin oder was auch immer.

$ mysqldump DATENBANK -u USER --password=XXXX > dump.sql

2. dump.sql im Editor öffnen

Nun die erstellte Datenbanksicherung in einem Editor Eurer Wahl, welcher die Funktionalität des Suchen&Ersetzens und speichern als UTF-8 beherrscht, öffnen. Sollte der SQL-Dump zu groß sein, muss er notfalls in einzelne Teile für die Bearbeitung zerlegt werden. Vim kam mit einem ca. 10MB großen SQL-Dumpfile noch relativ gut klar.

3. Tabellen CHARSET auf UTF-8 setzen

Nun werden in allen zur WordPress gehörigen Tabellen in den CREATE Statements die Angabe von CHARSET=latin1 mit CHARSET=utf8 ersetzt. Für den Editor vim würde der Aufruf so lauten:

:%s/CHARSET=latin1/CHARSET=utf8/g

4. Sonderzeichen und Umlaute in UTF-8 umwandeln

Der Weg des Ersetzens über die Datenbanksicherung hat nur einen kleinen Nachteil, das nun alle Sonderzeichen noch ebenfalls ersetzt werden müssen. Bei mir hielt es sich in Grenzen und betraf fast nur ÄäÖöÜöß und ein paar Ausnahmen wie éèá. Ich war mit ca. 10 Ersetzungsaufrufen durch. Was man jetzt noch übersehen hat, kann man auch später noch ersetzen oder sucht noch gezielter nach noch nicht konvertierten Sonderzeichen. Im Vim hab ich den bekannten Aufruf pro Zeichen wieder verwendet, wobei ?? den nicht korrekt dargestellen Zeichensatzcode enthalten soll:

:%s/??/Ä/g

Mein erster Versuch des direkten Konvertierens der dump.sql funktionierte mit iconv nicht so recht, so dass mich der folgende Aufruf nicht ans Ziel brachte und ich wie eben erwähnt die Zeichen einzeln im Editor ersetzen lassen habe.

$ iconv -f latin1 -t utf-f dump.sql > dump_utf8.sql

War wohl ein zu Blauäugiges herangehen ohne das Charset der Shell zu beachten.

5. modifizierte Datenbanksicherung zurück spielen

Jetzt muss nur noch die angepasste Datenbanksicherung als UTF-8 gespeichert und wieder eingespielt werden:

$ mysql DATENBANK -u USER --password=XXXX < dump.sql

UTF-8 in der Konfigdatei von WordPress

Zum Schluss erfolgt noch die Anpassung der Konfigurationsdatei von WordPress:

define('DB_CHARSET', 'utf8');

Ein Aufruf Eures Blogs dürfte nun keine Veränderung zu vorher zeigen, aber die Datenbank speichert nun als UTF-8 statt Latin1 :)

Eigentlich sollten es nur 5 kleine Anstriche werden, aber die Erklärungen blähen es größer auf als es eigentlich war. :)