2

RLIKE を使用して、mysql でいくつかの電子メール ドメインを検索しています。

クエリは次のとおりです。

SELECT something 
FROM table1 
WHERE SUBSTRING_INDEX(table1.email, "@", -1) RLIKE "test1.com"|"test2.com"

これは、例の数字を持つすべての電子メール ドメインと一致しました。

aaa@domain0.com

理由はありますか?

編集: また、少なくとも 2 桁の連続した電子メール ドメインが検出されることにも気付きました。

本当に奇妙です。

4

1 に答える 1

4

正規表現全体が単一引用符で囲まれている、引用符で囲まれた文字列に指定された、RLIKEまたはその必要がある文字列。REGEXPあなたが持っているのは、ビット単位の OR 演算子|である で区切られた 2 つの二重引用符で囲まれた文字列です。

これにより、式全体が として評価され、それがドメインが一致0する理由です。aaa@domain0.com

# The unquoted | evaluates this to zero:
mysql> SELECT "string" | "string";
+---------------------+
| "string" | "string" |
+---------------------+
|                   0 |
+---------------------+

# And zero matches domain0.com
mysql> SELECT 'domain0.com' RLIKE '0';
+-------------------------+
| 'domain0.com' RLIKE '0' |
+-------------------------+
|                       1 |
+-------------------------+

RLIKE代わりに、単一引用符で囲まれた文字列を使用し、. をバックスラッシュでエスケープする必要があります.^$部分文字列が一致しないように、アンカーも追加しています。

WHERE SUBSTRING_INDEX(table1.email, "@", -1) RLIKE '^test1\.com$|^test2\.com$'

と表現することもできます'^(test1\.com|test2\.com)$'。秘訣は、|優先順位が非常に低いため、一致させたい可能性のあるすべての文字列に対して両端が固定されていることを確認する必要があることです。

ただし、単にドメインのリストを一致させようとしている場合は、それを使用する方がはるかに簡単なIN ()ので、単にそれらをリストすることができます:

WHERE SUBSTRING_INDEX(table1.email, "@", -1) IN ('test1.com', 'test2.com', 'test4.org')
于 2015-07-01T13:30:39.413 に答える