【问题标题】:Searching MySQL for data that contains backslashes在 MySQL 中搜索包含反斜杠的数据
【发布时间】:2012-02-14 12:09:40
【问题描述】:

在数据库中,我在字段调用描述中存储了一些文本,保存在我的数据库中的字符串的值是Me\You "R'S'" %,这就是查询数据库命令行时的显示方式。

现在,在网页上,我有一个功能可以搜索此字段:

WHERE 描述 LIKE '%$searchstring%'

因此,当 $searchstring 被清理后,如果我正在搜索 Me\You,反斜杠将被转义并且我的查询显示为:

WHERE 描述 LIKE '%Me\\You%'

但是它没有返回任何东西。

这其中奇怪的部分是,当我搜索 Me\\You 或 Me\\\\You(所以两个或三个反斜杠,但不少或不多)时,它会返回一个反斜杠我期望的结果。

查询结果命令行时,不返回结果:

WHERE 描述 LIKE '%Me\You%'

或者当我使用两个或三个反斜杠时。

但是,如果我使用 4 - 7 个反斜杠,它将返回结果,例如:

WHERE 描述 LIKE '%Me\\\\\\\\You%'

将返回字符串Me\You "R'S'" %

任何人都有发生这种情况的理由吗?谢谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    注意
    因为 MySQL 在字符串中使用 C 转义语法(例如,“\n”表示换行符),所以您必须将在 LIKE 字符串中使用的任何“\”加倍。例如,要搜索“\n”,请将其指定为“\\n”。搜索“\”,指定为“\\\\”;这是因为反斜杠被解析器剥离一次,并在进行模式匹配时再次剥离,留下一个反斜杠进行匹配。

    来源:http://dev.mysql.com/doc/refman/5.1/en/string-comparison-functions.html#operator_like

    【讨论】:

      【解决方案2】:

      阅读Need to select only data that contains backslashes in MySQL 了解如何使用双反斜杠转义。你也可以在 NO_BACKSLASH_ESCAPES 模式下运行 MySQL (http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_no_backslash_escapes)

      【讨论】:

        【解决方案3】:

        虽然是一篇旧文章,但您可以使用替换功能绕过此限制,将反斜杠更改为另一个字符:在 WHERE 子句中类似这样。例子: WHERE replace('your field here', '\', '-') like "You-Me%"

        【讨论】:

        • 您能详细说明一下吗?
        • @user2966910 这在一个文本字段中是不可持续的.
        • 您还失去了通过这种方式在列上建立索引可能获得的任何性能优势。
        猜你喜欢
        • 2022-10-01
        • 2011-08-03
        • 2015-03-26
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多