【问题标题】:How to handle a query with special characters / (forward slash) and \ (backslash)如何处理带有特殊字符 /(正斜杠)和 \(反斜杠)的查询
【发布时间】:2013-05-10 20:28:47
【问题描述】:

我有一个表格,其中的一列允许特殊字符,如“/”(正斜杠)和“”(反斜杠)。

现在,当我尝试从表中搜索此类记录时,我无法获取这些记录。

例如:abc\def 或 abc/def

我正在生成如下搜索查询:

select * from table1_1 where column10 like '%abc\def%'

它返回 0 行,但实际上应该返回 1 条记录。在这种情况下如何编写查询?

【问题讨论】:

  • PL/SQL 是 Oracle 的过程语言(与 SQL 不同)... MySQL 是完全不同的 RDBMS... 您使用的是 Oracle 还是 MySQL?

标签: mysql plsql


【解决方案1】:

诀窍是只对反斜杠进行双重转义;对于字符串转义,只需要一次转义。

例如

  • 单引号'只需转义一次LIKE '%\'%'
  • 但是要查询反斜杠\,您需要双重转义到LIKE '%\\\\%'
  • 如果您想查询反斜杠+单引号 \' 然后 LIKE '%\\\\\'%'(带有 5 个反斜杠)

Explanation Source 摘录:

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

【讨论】:

  • 实际上,我通过不断添加直到查询有效,让它工作了很长时间。这个解释是我需要的,所以 +1 和我的答案
  • 对正斜杠有什么想法吗?在插入查询中。我的文字是 somex/Somey。这总是给我错误。
  • 你可以使用 $newtext=addslashes('somex/Somey'); php中的函数。 php.net/addslashes
  • 这并不能解释为什么需要四个斜线。从逻辑上讲,双重转义意味着两个斜线,加上一个作为实际内容的斜线,给我们留下\\`, not \\\`。根据 Barmar 的回答,使用了第四个 ` appears to be due to the LIKE` 子句,但此答案缺少该信息。
【解决方案2】:

在 MySQL 中,这是有效的:

select * from Table1
where column10 like '%abc\\\\def%'

FIDDLE

反斜杠是字符串和LIKE 模式的转义前缀。因此,LIKE 需要加倍,字符串文字语法需要加倍。

【讨论】:

    【解决方案3】:

    您必须使用另一个\ 来逃避\

     select * from table1_1 where column10 like '%abc\\def%'
    

    【讨论】:

      【解决方案4】:

      当我在 MySQL v5.5 上尝试时,转义 LIKE 值不起作用。经过几次尝试,真正起作用的是一个正则表达式(我也不得不在那里逃脱,并将它隐藏在一个字符类中)。我终于让它像这样工作了:

      select * from table1_1 where column10 rlike 'abc[\\]def'
      

      这些都不起作用:

      ... column10 like '%abc\\def%'
      ... column10 like concat('%abc', char(92), 'def%')
      ... column10 rlike 'abc\\def'
      

      请注意,您还将此标记为 PL/SQL,即 Oracle。您发布的查询在 Oracle 上按原样工作。 PL/SQL标签有错吗?

      【讨论】:

        【解决方案5】:

        使用转义。

        https://dev.mysql.com/doc/refman/5.0/en/string-literals.html

        表 9.1。特殊字符转义序列

        用序列表示的转义序列字符 \0 ASCII NUL (0x00) 字符。

        \' 单引号(“'”)字符。

        \" 双引号 (“"”) 字符。

        \b 退格字符。

        \n 换行符(换行符)。

        \r 回车符。

        \t 制表符。

        \Z ASCII 26 (Control+Z)。请参阅表格后面的注释。

        \ 反斜杠(“\”)字符。

        \% 一个“%”字符。请参阅表格后面的注释。

        _ 一个“_”字符。请参阅表格后面的注释。

        【讨论】:

          【解决方案6】:

          如果您使用 PHP sprintf() 将查询放在您想要的位置:

          AND column10 LIKE '%/%'

          这在 sprintf() 中对我有用:

          AND column10 LIKE '%%/%%'

          (MySQL 8 - WAMP)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-18
            • 2021-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多