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

Он разочарован экранированием шаблона MySQL, используемым в операторе LIKE.

root@dev> create table foo(name varchar(255));
Query OK, 0 rows affected (0.02 sec)

root@dev> insert into foo values('with\\slash');
Query OK, 1 row affected (0.00 sec)

root@dev> insert into foo values('\\slash');
Query OK, 1 row affected (0.00 sec)

root@dev> select * from foo where name like '%\\\\%';
Empty set (0.01 sec)

root@dev> select * from foo;
+------------+
| name       |
+------------+
| with\slash | 
| \slash     | 
+------------+
2 rows in set (0.00 sec)

root@dev> select * from foo where name like '%\\\\%';
Empty set (0.00 sec)

root@dev> select * from foo where name like binary '%\\\\%';
+------------+
| name       |
+------------+
| with\slash | 
| \slash     | 
+------------+
2 rows in set (0.00 sec)

Согласно документам MySQL: http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like %\\\\% - правильный операнд, но почему он не дает результата?

РЕДАКТИРОВАТЬ: база данных, которую я тестирую, в которой для character_set_database установлено значение utf8.Для дальнейшего исследования я создал ту же настройку в базе данных, в которой для character_set_database установлено значение latin1, и угадайте, что, '%\\\\%' работает!

РЕДАКТИРОВАТЬ: проблема может быть воспроизведена, и это проблема сопоставления полей.Подробности: http://bugs.mysql.com/bug.php?id=63829

Ответы [ 3 ]

2 голосов
/ 05 января 2017

В MySQL 5.6.10 с сопоставлением текстового поля utf8mb4_unicode_520_ci это может быть достигнуто путем использования 5 символов обратной косой черты вместо 4, то есть:

select * from foo where name like binary '%\\\\\%';

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

1 голос
/ 07 августа 2017

С MySQL 5.0.12 dev на Windows 10 я получил следующие результаты, когда изменил запрос с

SELECT * FROM `foo` WHERE `name` LIKE '%http:\/\/%'

на

SELECT * FROM `foo` WHERE `name` LIKE '%http:\\\\\\\%'

, он работает, и все же первая строка спрямая косая черта была оригинальным содержимым поля.Кажется, что передние косые черты интерпретируются как обратные косые черты.

0 голосов
/ 21 декабря 2011

Кажется, это имеет какое-то отношение к этой ошибке MySQL: http://bugs.mysql.com/bug.php?id=46659

Я думаю, что вы подключаетесь к mysql, не указав правильную опцию --character-set-server (по умолчанию latin1 с сопоставлением latin1_swedish_ci) и имея utf-8 в качестве текущей кодировки консоли. Это приводит к неправильным преобразованиям и сравнениям символов при работе с данными, которые должны быть преобразованы в utf8 из набора символов --character-set-server.

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