在MySQL中转义REGEX的奇怪行为

时间:2014-06-20 14:20:02

标签: mysql regex

你能解释一下这种行为吗?

mysql> SELECT *, ('http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx' REGEXP rule) r FROM containers_rules;
+---------------------------------------------------------------------------------------+------+
| rule                                                                                  | r    |
+---------------------------------------------------------------------------------------+------+
| ^http://www.thisisatest.es/\\?utm_source                                              |    0 |
| ^http://www.thisisatest.es/\?utm_source                                               |    1 |
+---------------------------------------------------------------------------------------+------+
5 rows in set (0.01 sec)

mysql> SELECT 'http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx' REGEXP '^http://www.thisisatest.es/\\?utm_source' r;
+---+
| r |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

我不明白为什么手动REGEX比较需要两个“\”和动态REGEX比较只需一个“\”或者它不起作用?

我有点失落......

2 个答案:

答案 0 :(得分:1)

您正在查看的结果集按原样显示列值(即​​没有其他转义字符)。

但是,字符串文字 需要额外的反斜杠;例如,第二行的insert语句应为:

INSERT INTO ... VALUES ('^http://www.thisisatest.es/\\?utm_source')

这符合您的手动查询。

答案 1 :(得分:1)

使用\?将匹配文字问号 使用\\?将匹配反斜杠?的零个或一个(\)个实例。

至于您的修改:

当您将^http://www.thisisatest.es/\?utm_source存储在数据库行中时,它将被理解为原样 当您使用REGEXP '^http://www.thisisatest.es/\?utm_source'时,转义符被替换,这意味着该模式被解释为^http://www.thisisatest.es/?utm_source,这是不正确的。 (它搜索零或一/