你能解释一下这种行为吗?
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比较只需一个“\”或者它不起作用?
我有点失落......
答案 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
,这是不正确的。 (它搜索零或一/
)