Нужно выбрать только те данные, которые содержат обратную косую черту в MySQL - PullRequest
6 голосов
/ 11 апреля 2011

Я пытаюсь исправить записи в базе данных, которые были дважды экранированы.Я полагаю, что magic_quotes был включен во время использования mysql_real_escape_string.Двойное экранирование привело к тому, что некоторые результаты поиска оказались неверными / отсутствовали.

Я отключил 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.00,92-сообщества.Сортировка является latin1_swedish_ci.Кодировка UTF-8 Unicode

% \\% НЕ работает.Я пробовал.На mysql.com он указан как неверный:

Чтобы найти «\», укажите его как «\\\\»;это связано с тем, что обратный слеш удаляется парсером один раз и снова, когда выполняется сопоставление с образцом, оставляя один обратный слеш для сопоставления.

Ответы [ 4 ]

5 голосов
/ 01 ноября 2012

Эта команда работает для меня, когда я запускаю команду с php:

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

Причина, по которой я включаю начало, где угодно и конец матча, состоит в том, чтобы показать, что они разные. Если вы ищете обратную косую черту в конце, вам нужно всего 4 обратной косой черты. это потому, что после этого некуда бежать. Вы используете 8 обратной косой черты в других командах, потому что они анализируются php.

2 голосов
/ 11 апреля 2011

Ваш запрос отлично работает для меня в 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)
0 голосов
/ 27 июня 2014

В случае Ruby on Rails

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

Если вы не хотите использовать групповые символы, добавьте их.

search_value.gsub!(/%/, "\\%").gsub!(/_/, "\\_")
0 голосов
/ 11 апреля 2011

Попробуйте:

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