Intereting Posts

Как искать слэш (\) в 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\\'); 

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

Из руководства для LIKE :

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

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

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

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

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

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

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

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

Для нахождения \ в текстовом поле мне пришлось избегать \ дважды, иначе был найден % в конце:

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