Reguläre Ausdrücke (RAs) in MySQL (ITG/slu)




Der MySQL-Operator regexp (= rlike) ist *nicht multibyte-safe*! -> select * from tokens where token regexp '^...$'; -> "für" fehlt, da "ü" in utf8 mit zwei Byte kodiert wird. regexp geht davon aus, dass jedes Zeichen durch exakt ein Byte kodiert ist. Beweis: "für" wird gefunden, wenn man nach exakt *vier* Zeichen im Feld Token sucht. In diesen Kontext fällt auch das beobachtete Phänomen mit der Ignorierung der Groß- und Kleinschreibung bei deutschen Umlauten. Zur Illustration führen Sie bitte folgende Abfragen aus: select * from tokens where token regexp '^Ö'; -- findet ausschließlich Tokens, die mit großem Ö beginnen select * from tokens where token regexp '^[Ö]'; -- ist eigentlich bedeutungsidentisch, findet jedoch auch alle tokens, die mit ö,Ü und ü beginnen (unser Korpus enthält keine initialen Ä,ä). Der Grund liegt darin, daß in der utf8-Kodierung die Zeichen Ä,Ö,Ü,ä,ö,ü im ersten Byte der Zwei-Byte-Kodierung denselben Zahlenwert, nämlich hex c3 aufweisen. Sie können dies verifizieren, indem Sie in der cygwin-Shell mit dem Kommando "echo" verschiedene Umlaute ausgeben lassen und dann mit dem Kommando "od" die Zahlenwerte anzeigen lassen:

echo 'ö' | od -t x1 

--> c3 b6 0a

echo 'Ö' | od -t x1

--> c3 96 0a

MySQL wertet also nur das erste Byte aus, was dann zu dem beobachteten Fehler führt.

Schreibe einen Kommentar