我在放入我的数据库中的东西上使用 mysql_real_escape_string,所以类似的东西Bob's Shop
会变成Bob\'s Shop
. 而且,例如,如果我尝试选择包含 的所有条目Bob\'s
,我的选择语句如下所示:
SELECT * FROM tbl WHERE name LIKE '%Bob\\\'s%'
无论出于何种原因,它都不起作用,即使它完全可以起作用。
如果该撇号被mysql_real_escape_string
函数转义,则在 DB 中输入的值将不包括反斜杠,这仅是出于安全目的。所以你的数据库中的最终值应该是Bob's
. 这就像在用引号括起来的字符串中转义相同的引号,例如"double \"quotes\""
and 'single \'quotes\''
。
您是否尝试%Bob\'s%
按原样查询?name列的数据类型是什么?我无法复制您的问题,它适用于您和我的示例。
我修复了它(感谢迈克尔向我展示了如何)。我正在发布我所做的事情,以防其他人遇到这个问题。
从来没有想出如何正确地将转义字符放在 LIKE 中,但问题是我打开了魔术引号,所以每当我使用 mysql_real_escape_string 时,它都会添加额外的转义字符,以便它不是存储为 Bob 的,而是存储为 Bob \的。这是禁用魔术引号的文档:http ://www.php.net/manual/en/security.magicquotes.disabling.php
对我来说,将php_flag magic_quotes_gpc Off
或php_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 以反映这一点。可能有更好的代码可以一次性完成所有列和所有转义字符,但出于我的目的,我不需要它。
嗨,我认为这可以为您的 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%"