Рассмотрим этот 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 '%\\\%';