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