编号字符串的MySQL RLIKE行为

时间:2015-07-01 13:14:49

标签: mysql regex rlike

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

以下是查询:

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

这与所有电子邮件域匹配,例如:

aaa@domain0.com

知道为什么吗?

编辑:我也发现它发现电子邮件域至少有两个连续的数字。

真奇怪。

1 个答案:

答案 0 :(得分:4)

提供给ActivityRLIKE的字符串需要是带引号的字符串,其中整个正则表达式是单引号。您拥有的是由REGEXP分隔的两个双引号字符串,即the bitwise OR operator

这导致整个表达式被评估为|,这就是域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 ()