【问题标题】:Need to select only data that contains backslashes in MySQL只需要在 MySQL 中选择包含反斜杠的数据
【发布时间】:2011-08-03 07:11:08
【问题描述】:

我正在尝试更正数据库中被双重转义的条目。我相信在使用 mysql_real_escape_string 时打开了magic_quotes。双重转义导致某些搜索结果不正确/丢失。

我已经关闭了magic_quotes,并计划搜索带有反斜杠的条目并更新它们以删除任何双重转义。麻烦的是,当我执行查询以搜索带有反斜杠的条目时,我总是没有得到任何结果。

SELECT title FROM exampletable WHERE title LIKE '%\\\\%'

我正在使用此处推荐的 '%\\\\%':http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

如果我输出每个标题,其中许多都有不需要的反斜杠,所以我知道它们在那里。我似乎无法在查询中隔离它们。

Example Data:
Old King\'s Road
Running Down A Dream
Can\'t Stop The Sun
This One's For Me

同样,只是尝试返回带有 \ 的条目。


编辑:MySQL 版本是 5.0.92-community。排序规则是 latin1_swedish_ci。字符集是 UTF-8 Unicode

%\\% 不起作用。我试过了。它在 mysql.com 上被列为不正确:

要搜索“\”,请将其指定为“\\\\”;这是因为反斜杠被解析器剥离一次,并在进行模式匹配时再次剥离,留下一个反斜杠进行匹配。

【问题讨论】:

  • 您不需要搜索双斜杠。仅搜索 %\\%。如果你双重转义,一个\会被正确解析并且你的字段数据有一个额外的\,所以你只需要搜索一个!
  • 您使用的是什么版本的 MySQL?请发布您的创建表语句,以及数据库的默认字符集和排序规则。
  • MySQL 版本为 5.0.92-community。排序规则是 latin1_swedish_ci。字符集是 UTF-8 Unicode。抱歉,暂时没有 create table 语句。

标签: mysql backslash


【解决方案1】:

当我使用 php 运行命令时,此命令对我有用:

select * from exampletable where title like '%\\\\\\\\%' or title like '\\\\\\\\%' or title like '%\\\\';

我包含开头、任何地方和结尾匹配的原因是为了表明它们是不同的。如果您在末尾寻找反斜杠,则只需要 4 个反斜杠。这是因为在它之后没有什么可以逃脱的。您在其他命令上使用 8 个反斜杠,因为它们会被 php 解析。

【讨论】:

    【解决方案2】:

    您的查询在 MySQL 5.5.8 中对我来说很好:

    mysql> create table exampletable (
      title varchar(255)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.15 sec)
    
    mysql> 
    mysql> insert into exampletable values ('Old King\\''s Road'),
      ('Running Down A Dream'),('Can\\''t Stop The Sun'),('This One''s For Me');
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> 
    mysql> select * from exampletable WHERE title LIKE '%\\\\%';
    +---------------------+
    | title               |
    +---------------------+
    | Old King\'s Road    |
    | Can\'t Stop The Sun |
    +---------------------+
    2 rows in set (0.01 sec)
    

    【讨论】:

    • 我怀疑这就是问题所在。服务器、表和列使用哪种字符集和排序规则?
    【解决方案3】:

    试试:

    SELECT title FROM exampletable WHERE title LIKE '%\\%'
    

    【讨论】:

    • 是的,忘了说我最初尝试过。 mysql.com 说四重 \ 是正确的,但似乎都不适合我。我尝试了从 1 到 5 的任意数量的反斜杠,但没有成功。
    【解决方案4】:

    对于 Ruby on Rails

    search_value.gsub!(/\\/, "\\\\\\\\\\")
    MyModel.where(["column_name ?","%#{search_value}%"])
    

    如果您不想使用通配符,请添加它们。

    search_value.gsub!(/%/, "\\%").gsub!(/_/, "\\_")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2019-04-18
      • 2022-07-07
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多