mysql like特殊字符_MySQL like查询字符转义遇到的坑

最近遇到一个问题, 在MySQL like查询时, 明明字符串时相同的, 但是却like不到结果, 后面经过多方面查找资料, 终于发现是字符串转义的问题, 而MySQL的LIKE的转义和普通字符串的不同。

首先来看一个测试:

可以看出”\\“在LIKE中转义成”“,LIKE的转义和平时用的字符串的转义还是有点不一样的。

查了下官方文档,对于转义字符的解释:

this is because the backslashes are stripped once by the parser and again when the pattern match is made,

leaving a single backslash to be matched against.

mysql自己的parser转义一次,然后LIKE的pattern对前面的结果再转义一次。

也就是说上例中的“\\”第一次转义成“\”,第二次才是“”。

再来看个mysql字符转义的测试

呵呵,什么都转义(比如”x” 转义成“x”,“b”是回退字符),就是不转义”%“和”_“。而LIKE,都转义。恐怕MYSQL这样做的目的也是为了兼容LIKE吧。

总结下,LIKE转义字符串时,一共两次,第一次不转义”%“和”_“,第二次全部转义。转义的特殊字符可以参见 http://dev.mysql.com/doc/refman/5.1/en/string-literals.html#character-escape-sequences

LIKE的转义可以看成先替换“\\”为“”,剩下的字符串用”\“转义,剩下的字符串再用””转义。通常不遇见“\”, LIKE的特殊解析是感觉不到的。

PHP版like特殊字符过滤

注意最后的双反斜杠转成了8个反斜杠, 其实就是1转4, 只不过在PHP字符串中需要转换一次, 这里有点绕,大家仔细想想,有问题可以留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值