1

另一个脑筋急转弯。

这不是通常的“但撇号正在破坏我的查询”,因为我知道所有关于转义和消毒的知识,所以我也会做对。

许多东西都存储在名称为“Assassin's”和“Babe's”的数据库中,最终名称为“Assassin\'s”和“Babe\'s”,恢复很好,但通过文本搜索......很痛苦。

LIKE "%Babe\'s%" 没有结果,"%Babe\\'s" 没有结果,"%Babe\'s" 没有结果。

但是如果我直接去服务器,那么它们都会产生结果。

换句话说,完全未经编辑的 SAME 查询将直接在 MySQL 引擎中工作,但通过 php 的 mysql api 发送它不会产生匹配的结果。

有什么想法可能导致这种情况吗?(我检查了 100 次斜杠等,是否存在字符集问题?”

很多很多很多提前感谢。

编辑:

我想我最好让自己更清楚:

"SELECT title FROM games WHERE title LIKE "%assassin\\\'s%";(因为 SQL 应该转义撇号并且其中一个斜杠将变成存储的斜杠,因为我们在此示例中正在寻找“刺客信条”)

编辑2:我们已经发现这是由于在实际数据库中由于消毒不良而逃脱了逃逸引起的。目前我正在尝试清理数据库和输入法。

编辑3:似乎魔术报价以某种方式开启了......我发誓它被关闭了!然而,不仅如此。该站点的数据库包装器有一个清理事件和一个导致问题的预清理。现在已经修复了,现在我正在运行一个脚本来(希望)清理数据库......

4

5 回答 5

5

我会认真考虑修复您数据库中的数据。

现在,话虽如此,MySQL 将\'和都识别''为转义的撇号。也就是说,除非服务器模式设置为使用严格的 SQL,否则只有在这种情况下才会''被识别。

数据肯定会在输入时被双重转义,最有可能在用户输入时一次(通过magic_quotes_gpc,使用addslashes),然后mysql_real_escape_string在您调用它时再次转义。

这将Assassin's Creed变成Assassin\\\'s Creed,最终将存储为Assassin\'s Creed.

magic_quotes_gpc如果可以的话,我强烈建议禁用它,因为它导致的问题多于修复的问题。

于 2010-06-21T19:42:12.793 回答
1

您是否尝试使用mysql_real_escape_string,还要检查是否启用了 magic_quotes 并弄乱了您的字符串

于 2010-06-21T17:06:46.440 回答
1

当您转义撇号以便可以将其存储在 MySQL 中时,不存储反斜杠。

所以试试这个:

SELECT title FROM games WHERE title LIKE "%assassin\'s%";

代替:

SELECT title FROM games WHERE title LIKE "%assassin\\\'s%";
于 2010-06-21T17:26:49.820 回答
0

SELECT title FROM games WHERE title REGEXP "assassin\'s";

将 REGEXP 视为 MySql 中更强大、更不挑剔的“LIKE”……不是万能的,而是商店中另一个很酷的工具。

于 2010-06-21T19:25:12.567 回答
-1

如文档所述,LIKE 和REGEXP子句中的斜线必须加倍

编辑:错误链接已更正

于 2010-06-22T10:03:48.130 回答