5

MySQL で REGEXP 比較を行うと、スウェーデン文字の大文字バージョンで奇妙な結果が得られます。私は utf8_swedish_ci 照合順序を使用しており、大文字の単語を見つけたいと思っています。

SELECT 'Öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$'1 を返すSELECT 'öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$'必要があり、0 を返す必要がありますが、逆の結果が得られます。

SELECT 'Öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 0 (incorrect)
SELECT 'öster' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 1 (incorrect)
SELECT 'Söder' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 1 (correct)
SELECT 'söder' REGEXP BINARY '^[A-ZÅÄÖ][a-zåäö]+$' # returns 0 (correct)

REGEXP BINARY の代わりに REGEXP を使用すると、'söder' も一致します (これは私が望むものではありません) が、それでも 'Öster' は一致しません。

これについてどうすればよいですか?

4

2 に答える 2

3

修正を見つけたと思いますが、それが機能する理由を説明したかったのです。REGEXPMySQL では、「文字」では機能しませんが、バイトでは機能します。Å、Ä、Ö、å、ä、ö はすべて UTF-8 の 2 バイト文字です。それらが正規表現[ ]構造で使用されると、正規表現エンジンはこれらの各バイトを個別に認識し、文字全体を構成する 2 バイトではなく、1 バイトのみを照合しようとします。これらの文字を構成要素のバイトに分解すると、まぐれによっていくつかの一致が発生した理由がわかります。

正規表現を使用する修正は'^([A-Z]|Å|Ä|Ö)[a-zåäö]+$'技術的には機能しますが、å、ä、およびöを構成するバイトが実際には他の意図しない整形式のUTF-8文字列が誤って一致することを許可しないのは偶然です。

'^([A-Z]|Å|Ä|Ö)([a-z]|å|ä|ö)+$'明確にするために使用することをお勧めします。

于 2013-09-17T17:51:32.303 に答える
0

さらに実験した後、次のように正規表現の大文字部分を変更すると問題が解決することがわかりました。

SELECT 'Öster' REGEXP BINARY '^([A-Z]|Å|Ä|Ö)[a-zåäö]+$'

なぜこれが異なる結果をもたらすのか理解できません。

于 2013-09-17T15:29:05.007 に答える