Suchen und Ersetzen in MySQL-Datenbanken

27 03 2006

Wie viel­leicht schon bemerkt wurde, habe ich kürz­lich eine Ände­rung an der Domain-​Struktur mei­ner Web­seite vor­ge­nom­men. Statt bis­her www​.jowra​.de, ist nun jowra​.com der allein gül­tige Domain­name. www​.jowra​.de ist zwar auch wei­ter­hin mei­nem Server-​Webspace zuge­ord­net, Auf­rufe über die­ser Adresse wer­den aber per Redi­rect mit Sta­tus­code 301 per­ma­nent auf jowra​.com umge­lei­tet (um den gefürch­te­ten Dou­ble Con­tent bei Google zu ver­mei­den). Glei­ches gilt für die Schreib­wei­sen mit www. vor dem Domain­na­men. (Warum die­ses WWW in der heu­ti­gen Zeit unsin­nig und ver­al­tet ist, beschreibt die­ser Arti­kel sehr anschau­lich und umfas­send. Siehe auch: no​-www​.org/ ) Es erge­ben sich also fol­gende Schreib­wei­sen und Redi­rects (alt -> neu):

www​.jowra​.de -> jowra​.com
jowra​.de -> jowra​.com
www​.jowra​.com -> jowra​.com
jowra​.com -> jowra​.com

Falls jemand mal ähn­li­ches umschrei­ben möchte, hier die pas­sende .htac­cess Datei, die natür­lich ins Root-​Verzeichnis gehört (etwaige andere Rewri­te­Rules gehö­ren dann auch in diese Datei).

RewriteEngine On
RewriteCond %{HTTP_HOST} !^jowra\.com [NC]
Rewriterule ^(.*) http://jowra.com/$1 [R=301,L]

Die Ände­rung des Domain­na­mens hat mich zwar erst mal einen Page­Rank 56 gekos­tet, aber who cares, so wich­tig ist das dann doch nicht. ;-) Das soll aber eigent­lich auch nicht das Thema sein, son­dern aus solch einer Umstel­lung (nicht nur bei Domain­än­de­run­gen, son­dern auch bei einer Neu­in­stal­la­tion, Pfad­än­de­run­gen u.ä.) erge­ben sich auch Aus­wir­kun­gen auf die WordPress-​Installation. Zum einen müs­sen natür­lich die Pfade im Admin-​Bereich ange­paßt wer­den, auf der ande­ren Seite ent­hal­ten aber sicher­lich auch die Bei­träge, Kom­men­tare usw. viele Ver­lin­kun­gen auf die eigene Seite. Durch den per­ma­nen­ten Redi­rect ist das nicht ganz so dra­ma­tisch, aber ich wollte das Ganze eben stim­mig machen und mußte des­halb in der Daten­bank einige Erset­zun­gen vor­neh­men. Unter dem Motto Hilfe zur Selbst­hilfe will ich des­halb mal schil­dern wie man das recht ein­fach über die Bühne bringt.

Vorab ein Hin­weis: Die hier beschrie­ben Maß­nah­men wir­ken sich direkt auf die Daten­bank aus, d.h. die Erstel­lung eines Back­ups (z.B. mit dem seit WP 2.0 ent­hal­te­nen Backup-​Plugin) wird unter­stellt. Am bes­ten die Ände­run­gen auch mal im Rah­men eines loka­len Web­ser­vers (z.B. XAMPP) tes­ten. Für Schä­den die aus den fol­gen­den Mani­pu­la­tio­nen an der Daten­bank ent­ste­hen, über­nehme ich selbst­re­dend keine Haf­tung. (Es sollte aber keine Pro­bleme geben. ;-) ).

Word­Press sichert in der all­ge­mei­nen Daten­bank wel­che in der wp-config.php defi­niert ist, ver­schie­dene Tabel­len die im Regel­fall mit wp_​begin­nen. Nach dem Durch­fors­ten die­ser Tabel­len und der darin ent­hal­te­nen Fel­der kamen für die Anpas­sung geän­der­ter Pfade fol­gende Tabel­len und Fel­der in Frage:

wp_​posts -> post_​content
wp_​comments -> comment_​content
wp_​comments -> comment_​author_​url
wp_​comments -> comment_​author_​email

einige Ände­run­gen sind u.U. auch an der wp_​options Tabelle vor­zu­neh­men, dies hatte ich aber vor­her schon per Hand erle­digt. Wir wol­len nun in die­sen Tabellen/​Feldern die Adresse www​.domain​.de durch domain​.com erset­zen (alles andere natür­lich sinn­ge­mäß). Dazu star­tet man aus­ge­hend vom Admi­nis­tra­ti­ons­be­reich des Webspace-​Paketes, die Ver­wal­tung der Datenbank(en), im Regel­fall sollte dies über phpMyAd­min erfol­gen. Unter phpMyAd­min wäh­len wir zunächst im lin­ken Bereich die Daten­bank aus. Dar­auf­hin wer­den die darin ent­hal­te­nen Tabel­len ange­zeigt, von denen die WordPress-​Tabellen wie oben erwähnt, mit wp_​begin­nen. Durch einen Klick auf die Tabelle wp_​posts wäh­len wir diese aus und im rech­ten Admi­nis­tra­ti­ons­be­reich erschei­nen dar­auf­hin Infor­ma­tio­nen zu die­ser Tabelle. Wir hal­ten uns damit nicht wei­ter auf und wech­seln zum Kar­tei­rei­ter SQL. Es öff­net sich ein Ein­ga­be­feld in wel­ches MySQL-​Datenbank-​Befehle geschrie­ben und dann direkt aus­ge­führt wer­den kön­nen. Rechts dane­ben sind übri­gens die Fel­der der aktu­el­len Tabelle (wp_​posts) auf­ge­führt, klickt man diese an, wird die Bezeich­nung in das Ein­ga­be­feld übernommen.

Der all­ge­meine Befehl zum Erset­zen einer Zei­chen­kette in MySQL lau­tet wie folgt (Der Zei­len­um­bruch nach dem Gleich­heits­zei­chen erfolgt hier nur aus Platzgründen):

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

in unse­rem Fall schrei­ben wir also:

UPDATE wp_posts SET post_content =
replace(post_content, 'www.domain.de', 'domain.com');

nach einem Klick auf OK dau­ert es nicht lange und SQL mel­det die erfolg­rei­che Erset­zung des Such­strings in XXX Fäl­len. Das wars schon. Das Glei­che füh­ren wir nun für die Tabelle wp_​comments durch, also wp_​comments im lin­ken Bereich aus­wäh­len, im rech­ten Bereich den Kar­tei­rei­ter SQL akti­vie­ren und mit dem Kommando:

UPDATE wp_comments SET comment_content =
replace(comment_content, 'www.domain.de', 'domain.com');

die betref­fende Zei­chen­kette erset­zen. Je nach dem ob es not­wen­dig ist (weiß der Sei­ten­be­trei­ber wohl am bes­ten), die Erset­zun­gen dann auch noch in den Fel­dern comment_​author_​url und comment_​author_​email vor­neh­men und dabei gege­be­nen­falls den Such­string anpas­sen. Bei der EMail-​Adresse habe ich z.B. fol­gen­des eingegeben:

UPDATE wp_comments SET comment_author_email =
replace(comment_author_email, 'domain.de', 'domain.com');

da ja in dem Fall das www. nicht vor­han­den ist. Mit die­sem Wis­sen las­sen sich natür­lich auch andere Zei­chen­ket­ten in allen mög­li­chen Tabel­len erset­zen. Sehr prak­tisch und dem manu­el­len Ändern von Pos­tings wohl vorzuziehen.

Wo wir gerade die Datenbank-​Verwaltung geöff­net haben: Ich stellte erst kürz­lich fest, daß Word­Press als SPAM dekla­rierte Kom­men­tare trotz­dem in der Daten­bank sichert und unter den ca. 3.300 Kom­men­ta­ren nur 1.000 »ver­nünf­tige« waren. Wer (wie ich) den SPAM mal aus­sor­tie­ren möchte, wen­det fol­gen­des Kom­mando an:

DELETE FROM wp_comments WHERE comment_approved = 'spam'

Damit wer­den alle Kom­men­tare die im Feld comment_​approved das Wort spam ent­hal­ten unwi­der­bring­lich gelöscht. Dies kann u.a. auch sinn­voll sein, wenn man mit sei­nem Daten­be­stand von Word­Press auf ein ande­res Sys­tem umstei­gen will, da die­ses u.U. mit der SPAM–Mar­kie­rung nichts anfan­gen kann und als ganz nor­male Kom­men­tare übernimmt.

Der zu Grunde lie­gende Fall mit mei­ner Domai­num­schrei­bung mag nicht so häu­fig vor­kom­men, ich denke aber, daß all­ge­mein das Suchen und Erset­zen von Zei­chen– und Zei­chen­ket­ten in MySQL pra­xis­re­le­vant ist und einige Hand­ar­beit bei der nach­träg­li­chen Kor­rek­tur von Arti­keln (u.ä.) erspart. Die Mög­lich­kei­ten sind viel­fäl­tig, so las­sen sich bei­spiels­weise auch HTML–Enti­ties in die nume­ri­sche Schrei­be­weise kon­ver­tie­ren (z.B. von ä nach ä) u.v.m.