由于项目需求,在mysql中以varchar存储了注册表路径,比如”software\microsoft”这样的
然而从”software\microsoft\iexplore”、 “software\microsoft\windows” 和 “software\another\another”中, 利用select的like功能取出”software\microsoft\iexplore”和”software\microsoft\windows”却遇到了问题
数据库中内容:
+----+--------------------+-----------------------------+
| id | rootkey | regsubkey |
+----+--------------------+-----------------------------+
| 1 | HKEY_LOCAL_MACHINE | software\microsoft\iexplore |
| 2 | HKEY_LOCAL_MACHINE | software\microsoft\windows |
| 3 | HKEY_LOCAL_MACHINE | software\another\another |
+----+--------------------+-----------------------------+
以 = 构造sql语句:
select * from database.table where regsubkey = "software\\microsoft\\iexplore";
可以顺利的取出需要的内容
+----+--------------------+-----------------------------+
| id | rootkey | regsubkey |
+----+--------------------+-----------------------------+
| 1 | HKEY_LOCAL_MACHINE | software\microsoft\iexplore |
+----+--------------------+-----------------------------+
以 like 构造sql语句:
select * from database.table where regsubkey like "software\\microsoft%";
则无法取到需要的内容。
Empty set (0.00 sec)
最后通过研究,需要4个\~~~~别惊讶~~就是4个
select * from database.table where regsubkey like "software\\\\microsoft%";
可以顺利的取出需要的内容
+----+--------------------+-----------------------------+
| id | rootkey | regsubkey |
+----+--------------------+-----------------------------+
| 1 | HKEY_LOCAL_MACHINE | software\microsoft\iexplore |
| 2 | HKEY_LOCAL_MACHINE | software\microsoft\windows |
+----+--------------------+-----------------------------+
这是在mysql的client下输入产生的结果,如果是放在php内,则 like 时需要输入8个\,= 时需要4个\
alert(\"".mysql_num_rows($result)."\");";
// alert("2");
$query = "select * from DATABASE.TABLE where `regsubkey` = 'software\\\\microsoft\\\\iexplore'";
$result = mysql_query($query, $conn) or die("Query DataBase Error!");
print "";
// alert("1");
?>
仔细分析后,可以发现
select * from database.table where regsubkey like "software\\\\microsoft%";
中需要4个,是由于从mysql console到mysql系统传送时,对\\进行一次替换,由”\\\\”变为”\\”,再应用于like中。而放在PHP内,则要先由PHP字符串处理将”\\\\\\\\”变为”\\\\”,再由字符串传送给mysql系统,于是变为”\\”。
简单的问题,体现出了一种细节上的东西,最初想当然的在PHP内使用”\\\\”,mysql console内使用”\\”,都是没有对这种转化有一个清晰的认识。在今后的开发中,尽量把细节上的问题考虑清楚,尽量把问题在development阶段处理掉,而不是放到Debug阶段。
想想也是,mysql要转义,php也要转义
这两转就成了\\\\了
[回复]