Странное поведение при LIKE с подстановочными знаками при поиске обратной косой черты в MySQL - PullRequest
7 голосов
/ 29 сентября 2011

Я столкнулся с очень необычной проблемой MySQL, связанной с обратным слешем.В основном, когда я сопоставляю символ подстановки с LIKE для \ n, который находится в базе данных как текст, а не как символ новой строки, он будет возвращать совпадение только в том случае, если у меня есть только символ подстановки для правой руки:

SELECT * 
FROM  `tmptest` 
WHERE  `a` LIKE  '\\\\n%'

Сейчасесли я сделаю такой запрос, он ничего не вернет:

SELECT *  
FROM `tmptest` 
WHERE `a` LIKE '%\\\\n%'

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

Таблицаструктура:

CREATE TABLE IF NOT EXISTS `tmptest` (
`a` varchar(22) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Пример данных:

INSERT INTO `tmptest` (`a`) VALUES
('\\n'),
('\\n\\ndfsdfsdfs\\n');

Спасибо, что нашли время, чтобы прочитать это.

Ответы [ 2 ]

6 голосов
/ 29 сентября 2011

Это работает для меня с 6 обратной косой чертой при использовании левого подстановочного знака:

mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%';
+-----------------+
| a               |
+-----------------+
| \n              |
| \n\ndfsdfsdfs\n |
+-----------------+
2 rows in set (0.00 sec)

Использование mysqld Ver 5.1.49


@ Karolis, насколько я понимаю, выражение для оператора LIKE должно быть проанализировано дважды, поэтому \\\\ превращается в \ при использовании с LIKE.

Но как это объяснить (используя выражение "back \ slash"):

SELECT 'back\\slash' LIKE '%back\\\\slash%'; -> TRUE (нормальное поведение)

SELECT 'back\\slash' LIKE '%back\\\\\slash%'; -> TRUE (5 обратных слэшей?)

SELECT 'back\\slash' LIKE '%back\\\\\\slash%'; -> TRUE (6 обратных слэшей?)

SELECT 'back\\slash' LIKE '%back\\\\\\\slash%'; -> TRUE (7 обратных слэшей?)

SELECT 'back\\slash' LIKE '%back\\\\\\\\slash%'; -> FALSE (нормальное поведение, я думаю ..)

Тем не менее, если вы ищете только "\":

mysql> SELECT 'back\\slash' LIKE '%\\\\%'; -> FALSE (но должно работать)

mysql> SELECT 'back\\slash' LIKE '%\\\\\%'; -> TRUE (5 обратных слэшей)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\%'; -> TRUE (6 обратных слэшей)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\\%'; -> FALSE (7 обратных слэшей)

Для этого конкретного вопроса можно использовать другой escape-символ | и вообще обойти проблему (если не встречается | символ):

mysql> SELECT 'back\\slash' LIKE '%\\%' ESCAPE '|'; -> ИСТИНА

Так что, возможно, какой-нибудь гуру mysql сможет это объяснить. Я просто не могу. также протестирован с mysql 5.1.53 на другой машине. Такое же поведение наблюдалось. Как я начал комментировать, это довольно интересный вопрос.

0 голосов
/ 03 января 2013

На основе ответа QSP (как я благодарю его за спасение моего дня).

Я бы сказал, используйте 5 черные черты. Я не понимаю, почему, как QSP и Karolis, но если вы замените 1 слеш на 5 slaches в mySQL (или 10 в php), он все равно будет работать, как говорят QSP.

НО хорошо, если вы замените '\\' на 12 обратных слешей (или 24 в php), как предполагает QSP, это не сработает. Но если заменить его на 10 обратных слешей (или 20 в php), он все равно будет работать.

Я надеюсь, что это может помочь кому-то, поскольку ответ QSP уже принят.

РЕДАКТИРОВАТЬ:
Это хорошо работает, если вы делаете:
% \\\\\%
% \\\\\\\\\\%
% К \\\\\\\\\\% s
% \\\\\\\\\\% s
% k \\\\\ s% (если только 1 косая черта, как назад \ косая черта)
Но это не сработает, если вы это сделаете:
% К \\\\\\\\\\%
% К \\\\\%
% \\\\\% s
Я буду продолжать смотреть, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...