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