Подтвердить что ты не робот

Как искать слэш (\) в MySQL? и почему escaping (\) не требуется для where (=), но для Like требуется?

Рассмотрим этот QUERY (ДЕМО ЗДЕСЬ)

(SELECT * FROM `titles` where title = 'test\\')
UNION ALL
(SELECT * FROM `titles` where title LIKE 'test\\\\')

Вывод:

| ID | TITLE |
--------------
|  1 | test\ |
|  1 | test\ |

Вопрос:

Почему не требуется дополнительное (\) для (=), но для (например) требуется дополнительное \\? Ясно, что MySQL избежал (test \) с (test \\), а использование (test \\\\) логично для LIKE.

Информация о таблице:

CREATE TABLE IF NOT EXISTS `titles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `titles`
--

INSERT INTO `titles` (`id`, `title`) VALUES
(1, 'test\\');
4b9b3361

Ответ 1

\ по умолчанию выполняет функцию escape-символа в LIKE.

В руководстве для LIKE:

Поскольку MySQL использует синтаксис C escape в строках (например, "\n" для представления символа новой строки), вы должны удвоить любой "\", который вы используете в строках LIKE. Например, для поиска "\n" укажите его как "\\n". Чтобы найти "\", укажите его как "\\\\"; это происходит из-за того, что обратная косая черта разделяется один раз парсером и снова, когда совпадение с шаблоном выполняется, оставляя единую обратную косую черту, которая должна быть сопоставлена.

Вы можете изменить это, указав другой escape-символ, как в:

SELECT * FROM `titles` where title LIKE 'test\\' ESCAPE '|'

Ответ 2

Собственно, все предыдущие ответы были искажены где-то. Как вы можете видеть в ссылке, предоставленной Karoly Horvath, чей значительный бит воспроизводится Explosion Pills, правильный способ поиска 1 обратного слэша (\) состоит в том, чтобы использовать сразу 4 обратных слэша (\\\\).

Кстати, чтобы показать выше, что одна обратная косая черта мне пришлось использовать сразу два, и чтобы показать эти четыре, мне пришлось использовать восемь.

Ответ 3

LIKE принимает два символа дикой природы, % и _.

Чтобы соответствовать этим символам, можно использовать экранирование: \%, \_. Это также означает, что если вы хотите соответствовать \, он также должен быть экранирован.

Все это описано в руководстве.

Ответ 4

Чтобы найти a \ в текстовом поле, мне пришлось дважды <\ выйти, а в конце было найдено %:

SELECT * FROM `table` where `field` LIKE '%\\\%';