使用MySQL LIKE在数据库中选择转义字符串

时间:2012-07-28 13:43:19

标签: php mysql string escaping

我对放入数据库的东西使用mysql_real_escape_string,因此像Bob's Shop这样的东西会变成Bob\'s Shop。并且,例如,如果我尝试选择包含Bob\'s的所有条目,我的select语句如下所示:

SELECT * FROM tbl WHERE name LIKE '%Bob\\\'s%' 

无论出于何种原因,它都不起作用,即使它完全可以理解它会起作用。

3 个答案:

答案 0 :(得分:1)

如果撇号由mysql_real_escape_string函数转义,则在DB中输入的值将不包括反斜杠,仅出于安全目的。因此,数据库中的最终值应为Bob's。这就像在引号中包含的字符串中转义相同的引号,例如"double \"quotes\""'single \'quotes\''

您是否尝试按原样查询%Bob\'s%名称列的数据类型是什么?我无法复制您的问题,它与您和我的示例一起使用。

答案 1 :(得分:0)

我修好了(感谢Michael向我展示了如何)。我正在发布我所做的事情以防其他人遇到这个问题。

从来没有弄清楚如何在LIKE中正确放置转义字符,但问题是我启用了魔术引号,所以每当我使用mysql_real_escape_string时,它都会添加额外的转义字符,这样它就不会被存储为Bob的,而是存储为Bob的。这是禁用魔术引号的文档:http://www.php.net/manual/en/security.magicquotes.disabling.php 对我来说,将php_flag magic_quotes_gpc Offphp_value magic_quotes_gpc Off放在.htaccess中是行不通的,因为我使用的是购买的主机,主机不允许这样的设置。所以我将magic_quotes_gpc = Off放在一个名为php.ini的文件中,并将其放在我需要的每个目录中。

由于我的MySQL数据库中已有很多行包含额外的反斜杠,因此当我关闭魔术引号时,我需要摆脱它们。您可以通过发出如下查询来轻松完成此操作:UPDATE tbl SET col=REPLACE(col,'\\\'','\'') WHERE col LIKE '%\'%'将tbl替换为您的表名,将col替换为您正在使用的任何列。如果您需要修复其他转义字符,只需更改REPLACE和LIKE即可。可能有更好的代码可以一举完成所有列和所有转义字符,但出于我的目的,我不需要它。

答案 2 :(得分:-1)

嗨,我认为这可以帮助你学习mySQL和Java,

在Java中

char quotes ='"';

String sql =" SELECT * FROM tb1 where name LIKE "+quotes+"%Bob's%"+quotes+" ;";

mySQL查询

SELECT * FROM tbl WHERE name LIKE "%Bob's%"