2

我正在使用 RLIKE 使用 mysql 查找一些电子邮件域。

这是查询:

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

这匹配了所有带有数字的电子邮件域,例如:

aaa@domain0.com

知道为什么吗?

编辑:我还注意到它会找到至少有两个连续数字的电子邮件域。

真的很奇怪。

4

1 回答 1

4

提供给RLIKEREGEXP需要是带引号的字符串的字符串,其中整个正则表达式是单引号的。您拥有的是两个用 分隔的双引号字符串|,即按位 OR 运算符

这导致整个表达式被评估为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 回答