0

実際にイニシャルを含む名前フィールドを識別する MySQL クエリを作成しようとしています。問題は、クエリが一致しないはずのレコードを取得していることです。

正規表現文字列が正しいことを確認するために RegEx Buddy の POSIX ERE 正規表現実装に対してテストを行いましたが、MySQL クエリで実行すると結果が異なります。

たとえば、クエリは次のような文字列を識別する必要があります。

「AJD」または「AJ D」。

ただし、「Ralph」や「Terrance」などの文字列にも一致しています。

クエリ:

SELECT *, firstname REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' FROM test_table

ここの「firstname」フィールドは、関連する場合は VARCHAR 255 です。

テーブルデータではなく文字列リテラルで実行すると、同じ結果が得られます。

SELECT 'Ralph' REGEXP '^[a-zA-z]{1}(([[:space:]]|\.)+[a-zA-z]{1})+([[:space:]]|\.)?$' 

MySQL のドキュメントは REGEXP の潜在的な問題について警告していますが、これが私が見ている問題に関連しているかどうかはわかりません:

警告 REGEXP および RLIKE 演算子はバイト単位で機能するため、マルチバイトに対して安全ではなく、マルチバイト文字セットで予期しない結果が生じる可能性があります。さらに、これらの演算子は文字をバイト値で比較するため、特定の照合で等しいと見なされたとしても、アクセント付き文字は等しいとは見なされない場合があります。

前もって感謝します。

4

1 に答える 1

1

mysqlクライアントでこれをテストしている場合は、円記号をエスケープする必要があります。入力は最初にmysqlクライアントによって処理されるため、これはになります\.。これはになります。したがって、バックスラッシュをエスケープして保持するようにする必要があります。\\.\..

于 2013-02-19T11:32:41.730 に答える