In meiner Datenbank für das Content Management System sind auch die Untertitel für die einzelnen Bilder gespeichert. Um den gesetzlichen Anforderungen gerecht zu werden und alle Bilder mit Hinweis auf die Bildautoren korrekt zu kennzeichnen, musste ich einen unschönen Workaround verwenden. In der Konsequenz ist in einigen Datenbankfeldern nun HTML Code eingetragen. Bei einer deutlich dreistelligen Anzahl dieser Felder ist eine manuelle Pflege kaum noch möglich.
Mühsam habe ich nun in den vergangenen Wochen die Inhalte dieser Felder halbautomatisch auf ein einheitliches Format gebracht, so dass nun eine automatisierte Pflege möglich wird. Automatisiert heißt hierbei, dass ich Anpassungen an dem HTML Code durch SQL Code in der MySQL Datenbank erfolgen lassen möchte.
Ein einigermaßen nützliches Werkzeug hierzu ist die Funktion REPLACE in MySQL. Die Funktion erfordert drei Parameter:
REPLACE(Quelle, Suchstring, Ersatzstring)
Der Parameter Quelle beinhaltet dabei entweder in Anführungszeichen angegeben einen festen String, oder aber – weitaus sinnvoller – den Namen eines Tabellenfeldes aus dem der Wert bei einer dynamischen Abfrage ausgelesen werden soll. In der Variablen Suchstring wird dann das Suchmuster übertragen, das in der Quelle gefunden und anschließend durch den Wert des Parameters Ersatzstring ausgetauscht werden soll.
Der Funktionsaufruf
REPLACE('Dies ist das Muster', 'Muster', 'Resultat');
liefert dann als Ergebnis den Text “Dies ist das Resultat”.
Bedauerlicherweise versteht MySQL an dieser Stelle keine regulären Ausdrücke, so dass der Suchstring starr vorgegeben werden muss. Eine äußerst einschränkende Funktionsschwäche.
Für meinen Anwendungsfall wollte ich nun alle Vorkommen eines Textfragments in einer Tabelle durch einen anderen ersetzen. Ein DIV-Tag sollte nun mit einer Klasse versehen werden. Aus dem blanken <div> sollte nun also ein <div class=”klasse”>werden.
Der hierfür erforderliche SQL Befehl ist dann mit der REPLACE Funktion einfach implementiert:
UPDATE tabellenname SET spalte = REPLACE(spalte, '<div>', '<div class="klasse">') WHERE spalte LIKE '%<div>%';
Dieses Kommando lässt die Datenbank in der Tabelle “tabellenname” alle Zeilen finden, in denen ein <div> im Feld “spalte” enthalten ist um dann dieses <div> durch ein <class=”klasse”> zu ersetzen. Die WHERE Bedingung ist sicherlich nicht erforderlich, verhindert aber, das alle Einträge der Datenbank aktualisiert werden, auch wenn das DIV-Tag nicht enthalten ist. Man beachte, dass “spalte” im Funktionsaufruf nicht in Anführungszeichen gesetzt werden darf, da andernfalls in jeder Zeile der Datenbank das Wort “spalte” nach “<div>” durchsucht wird und natürlich kein Ergebnis liefert.
Wie immer macht es natürlich Sinn bei solchen tiefgreifenden Änderungen im Vorfeld eine Sicherung oder Kopie der Tabelle anzulegen. Mit Suchen-und-Ersetzen Funktionen hat man schnell einen enormen und in der Regel irreversiblen Schaden angerichtet.