Vor kurzem bin ich über ein Problem mit Sonder-, bzw. Steuerzeichen, in den Werten einer MySQL-Datenbank gestolpert. Ein Cron sollte Daten aus einer Tabelle lesen und per SOAP an einen Server übermitteln. Gelegentlich brach die Übertragung mit folgender Fehlermeldung ab:
“An invalid XML character (Unicode: 0x1f) was found in the element content of the document.”
Wie findet man nun einen Datensatz, in dem dieses (nicht sichtbare) Steuerzeichen auftaucht? Zum Beispiel mit folgendem Query:
SELECT *
FROM `some_table`
WHERE `some_field` LIKE CONCAT("%", 0x11, "%")
Damit ist aber nur dieses eine Zeichen abgedeckt. Möchte man nun prüfen, ob es auch Datensätze mit anderen Steuerzeichen gibt, hilft ein regulärer Ausdruck:
SELECT * FROM `some_table` WHERE `some_field` REGEXP ".*[[:cntrl:]]+.*"
Die Zeichenklasse [:cntrl:] steht hier für alle Steuerzeichen. Weitere Infos zu REGEXP und Zeichenklassen findet man in der MySQL-Reference.
Tags: mysql sonderzeichen steuerzeichen