MySQL LIKE查询中反斜杠与ESCAPE子句转义下划线的差异问题
MySQL LIKE查询中反斜杠转义与ESCAPE转义下划线的区别
两种转义方式的核心差异在于转义字符的生效规则不同:
- 反斜杠
\是MySQL LIKE语法默认的内置转义字符,无需额外声明即可直接使用,作用是将紧跟在其后的通配符(_匹配任意单个字符、%匹配任意长度任意字符)转换为普通字面量匹配。 ESCAPE关键字用于为当前查询自定义指定转义字符,指定后,转义字符本身不再承担原有的语义(比如原本_是通配符,被指定为转义符后就不再是通配符),仅作为转义标记存在:紧跟在转义字符后的第一个字符会被当做普通字面量处理;如果要匹配转义字符本身的字面量,需要连续写两个转义字符。
两条查询结果差异的原因
两条SQL执行结果不同,本质是转义规则的应用逻辑完全不一样:
第一条查询
select 'a_a' like 'a\_a';
这条语句没有自定义转义字符,走默认转义规则:\_中的反斜杠将后续的下划线转义为普通下划线字符,整个匹配规则为「字符a + 普通下划线 + 字符a」,和待匹配字符串a_a完全一致,因此匹配成功,返回1。
第二条查询
select 'a_a' like 'a_a' escape '_';
这条语句手动将下划线_指定为转义字符,此时下划线不再是匹配单个任意字符的通配符,仅作为转义标记存在。我们拆解匹配串a_a的实际语义:
- 第一个字符
a是普通字面量,匹配待匹配串的开头a - 第二个字符是转义符
_,按照规则它会将紧跟的第三个字符a标记为普通字面量 - 整个匹配串实际只能匹配长度为2的字符串
aa,和长度为3的待匹配串a_a完全不相符,因此匹配失败,返回0。
补充说明:如果非要用
_作为转义字符来匹配a_a,正确的匹配串需要写成a__a(即转义符_后面跟一个被转义为普通字符的_),但这种写法可读性极差,非常容易造成语义混淆,实际开发中完全不推荐使用。
内容的提问来源于stack exchange,提问作者user3442754
相关产品推荐
相关产品推荐

