MySQL中正则表达式转义的奇怪行为

MySQL中正则表达式转义的奇怪行为,mysql,regex,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; +---------------------------------------------------------------------------

你能给我解释一下这种行为吗

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)
我不明白为什么手动正则表达式比较需要两个“\”而动态正则表达式比较只需要一个“\”,否则它就不起作用了


我有点不知所措…

您看到的结果集按原样显示列值(即,没有其他转义字符)

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

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

这与您的手动查询相匹配。

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

至于您的编辑:

当您有
^http://www.thisisatest.es/\?utm_source
存储在数据库行中,将按原样理解。

当您使用
REGEXP'^http://www.thisisatest.es/\?utm_source'
,转义被替换,这意味着模式被解释为
^http://www.thisisatest.es/?utm_source
,这是不正确的。(它搜索零或一个
/

实际上,手动正则表达式需要两个反斜杠。那么为什么
选择'http://www.thisisatest.es/?utm_source=xxxx&utm_term=&utm_campaign=xxxx&utm_medium=xxxx“REGEXP”^http://www.thisisatest.es/\?utm_源'r返回0?尝试执行
选择'^http://www.thisisatest.es/\?utm_源'然后您将看到它为什么不匹配。一旦将正则表达式加载到数据库中,它就不再将
\?
解析为
。我将编辑我的答案以详细说明。正则表达式是作为字符串还是正则表达式对象存储在数据库中的?如果它是一个字符串,则需要将其存储为
\\?
,然后为编辑器
“\\\?”
再添加一个字符串,对吗?