由mysql select中使用like引出的细节问题

  由于项目需求,在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阶段。

One thought on “由mysql select中使用like引出的细节问题”

发表评论

电子邮件地址不会被公开。 必填项已用*标注