主页 > MySQL教程 > 正文

MySQL like查询字符转义遇到的坑

最近遇到一个问题, 在MySQL like查询时, 分明字符串时相同的, 可是却like不到成果, 后边通过多方面查找材料, 总算发现是字符串转义的问题, 而MySQL的LIKE的转义和一般字符串的不同。


首要来看一个测验:

mysql> SET @a='\\';SELECT @a,@a LIKE '\\\\';
 
+----+----------------+
| @a | @a LIKE '\\\\' |
+----+----------------+
| \  |              1 |
+----+----------------+

能够看出”\\\\“在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对前面的成果再转义一次。


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


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

mysql> SELECT '\%','\_';
+----+----+
| \% | \_ |
+----+----+
| \% | \_ |
+----+----+
1 row in set


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


总结下,LIKE转义字符串时,总共两次,第一次不转义”\%“和”\_“,第2次悉数转义。转义的特别字符能够拜见 http://dev.mysql.com/doc/refman/5.1/en/string-literals.html#character-escape-sequences


LIKE的转义能够当作先替换“\\\\”为“\”,剩余的字符串用”\\“转义,剩余的字符串再用”\"转义。一般不遇见“\\”, LIKE的特别解析是感觉不到的。


PHP版like特别字符过滤

function likeEscape($str) {
    return strtr($str, array('%'=>'\\%', '_'=>'\\_', '\\'=>'\\\\\\\\'));
}

留意最终的双反斜杠转成了8个反斜杠, 其实便是1转4, 只不过在PHP字符串中需求转化一次, 这儿有点绕,咱们细心想想,有问题能够留言


上一篇:mysql 的Escape转义字符串
下一篇:MySQL保存几位小数的4种办法

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854