Update einer Wordpress 2.8 Installation auf Version 2.9 mit Umstellung von MySQL 4.x Datenbank auf MySQL 5.x

Seit einiger Zeit zeigte mir das Backend meines Weblogs (Wordpress, Version 2.8) die Möglichkeit des Updates auf Version 2.9 an. Warum also nicht die automatische Updatefunktion nutzen und Wordpress auf den neuesten Stand bringen?

Als Ergebnis erhielt ich die Meldung das dies nicht funktioniert, die Datenbank lief noch in der 4.x Version, Wordpress 2.9 benötigt eine MySQL-Datenbank der Version 5.x mit utf-8 Zeichensatz.

Vorweg wichtige Hinweise:

  • Die Grundlage allen Tuns sind Backups!!!
  • Wer diese Anleitung nachvollzieht tut dies in eigener Verantwortung!
  • Ich übernehme keinerlei Haftung für die hier vorgestellten Vorgehensweisen!

Die neue 5.x MySQL-Datenbank war schnell angelegt, der Dump aus der alten Datenbank (mit Zeichensatz latin-1 erstellt) in die neue Datenbank (Zeichensatz utf-8) eingespielt. Nun mussten noch die Zugangsdaten von Wordpress für die neue Datenbank in der Datei wp-config.php geändert werden (ersetzen von Datenbankname, Datenbankbenutzer, Passwort und DB-Host durch die neuen Angaben).

Hierbei stieß ich auf das nächste Problem, im Browser stand: keine Verbindung zur Datenbank möglich. Die Lösung fand ich in der wp-config-sample.php. Die Konfiguration von Wordpress benötigt 4 sogenannte Phrasen. Diese erhält man unter api.wordpress.org/secret-key/1.1/ 

Die 4 Zeilen mit den Keyphrasen kopiert man in die wp-config. Einfach die vorhandenen Zeilen mittels // auskommentieren oder löschen. Jetzt funktionierte auch mein Wordpress wieder und einer Aktualisierung auf Version 2.9 stand nichts mehr im Wege.

Nun musste nur noch das Probelm mit den unterschiedlichen Zeichensätzen gelöst werden. Das Frontend des Weblogs zeigte die Umlaute nicht richtig an. Das kleine ü beispielsweise wurde als ¼ angezeigt. Allerdings ist es sehr zeitaufwändig jeden Artikel einzeln zu bearbeiten. Für diesen Fall bietet es sich an, die Einträge in der Datenbank über SQL-Befehle zu bearbeiten.

Als Ausgangsbefehl habe ich hierfür folgenden genutzt:

UPDATE tabellenname SET feldname = replace(feldname, 'suchstring', 'ersatzstring');

Mit diesem Befehl kann man in MySQL Zeichen oder Zeichenketten austauschen, jeweils bezogen auf die entsprechende Tabelle und das entsprechende Feld.

Über den Registerreiter SQL in phpMyAdmin erhält man eine Eingabemaske, um entsprechende Befehle ausführen zu können.

Folgende Tabellen und Felder sollte man updaten (eine Vollständigkeit wird nicht garantiert):

  • Tabelle wp_comments die Felder comment_author und comment_content
  • Tabelle wp_links die Felder link_name und  link_description

Mit den folgenden Befehlen habe ich in einem Ritt in den Kommentaren die falschen Zeichen gegen die richtigen ausgetauscht:

UPDATE wp_comments SET comment_content = replace(comment_content, '߸', 'ß');
UPDATE wp_comments SET comment_content = replace(comment_content, '¤', 'ä');
UPDATE wp_comments SET comment_content = replace(comment_content, '¶', 'ö');
UPDATE wp_comments SET comment_content = replace(comment_content, '¼', 'ü');

Hierzu muß man aber wissen, wie Wordpress die Umlaute in der Datenbank abspeichert. Das Feld comment _author ist als tinytext angelegt und das Feld comment_content als text. Umlaute wie beispielsweise das ü werden in meiner Datenbank auch als ü abgespeichert. Auch nachdem die Datenbank komplett auf utf-8 umgestellt ist.

Nach diesem Verfahren kann man mit geringem Aufwand unter Kenntniss der richtigen Befehle und Tabellen sowie der Felder das Umlauteproblem recht schnell lösen. Auch hier auf comfu-web.de habe ich die Umlaute so ausgetauscht. Hier allerdings musste ich schauen wie die Umlaute abgespeichert werden.

Eine Erklärung für die Datenbankbefehle für MySQL füge ich noch hinzu, die Originalbefehle stammen von http://codex.wordpress.org/Converting_Database_Character_Sets

SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', REPLACE(column_type, 'char', 'binary')) FROM information_schema.columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%char%';
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', REPLACE(column_type, 'text', 'blob')) FROM information_schema.columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%text%';
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%char%';
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8;') FROM columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%text%';

ALTER DATABASE Datenbankname CHARACTER SET utf8;

SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', REPLACE(column_type, 'binary', 'char')) FROM columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%binary%'; 
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', REPLACE(column_type, 'blob', 'text')) FROM columns WHERE table_schema = 'Datenbankname' and data_type LIKE '%blob%';

ALTER TABLE wp_links CHANGE link_visible link_visible ENUM('Y','N') CHARACTER SET utf8;

 

 

Viel Spaß beim Nachvollziehen und keine Fehler machen!