您的位置:首页 > 编程语言 > PHP开发

Mysql LIKE中特殊字符转义【附php实现函数】

2013-04-22 16:53 721 查看
提要: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对前面的结果再转义一次。

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

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

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


呵呵,什么都转义(比如"\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转义代码:

//$pdo是PDO的实例,
//$str为搜索的字符串,如从表单中直接提交获取的
//先完成LIKE的转义
$str=strtr($str,array('%'=>'\%', '_'=>'\_', '\\'=>'\\\\'));
//添加 %及_,组成完整搜索条件
$str='%'.$str.'%';
//mysql字符串的转义
$str=$pdo->quote($str);


            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL like