2011-12-20 2 views
5

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

[email protected]> create table foo(name varchar(255)); 
Query OK, 0 rows affected (0.02 sec) 

[email protected]> insert into foo values('with\\slash'); 
Query OK, 1 row affected (0.00 sec) 

[email protected]> insert into foo values('\\slash'); 
Query OK, 1 row affected (0.00 sec) 

[email protected]> select * from foo where name like '%\\\\%'; 
Empty set (0.01 sec) 

[email protected]> select * from foo; 
+------------+ 
| name  | 
+------------+ 
| with\slash | 
| \slash  | 
+------------+ 
2 rows in set (0.00 sec) 

[email protected]> select * from foo where name like '%\\\\%'; 
Empty set (0.00 sec) 

[email protected]> 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%\\\\% является правый операнд, но почему она не дает никакого результата?

EDIT: База данных, в которой я тестирую, имеет значение character_set_database для utf8. Чтобы продолжить мое исследование, я создал ту же настройку в базе данных, которая имеет character_set_database, установленную на latin1, и угадайте, что работает '%\\\\%'!

EDIT: Проблема может быть воспроизведена, и это проблема сопоставления полей. Реквизиты: http://bugs.mysql.com/bug.php?id=63829

+0

Когда я использую ваши команды точно, 'select * from foo, где имя типа '% \\\\%';' работает для меня. Я не понимаю, почему это не работает для вас, мне любопытно узнать. –

+0

Возможно, это связано с кодировкой базы данных. Я обновил оригинальный пост. – EnToutCas

+0

Проверьте: - 'select @@ session.sql_mode; select @@ global.sql_mode; ' – ajreal

ответ

0

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

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

2

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

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

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

0

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

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

в

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

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

Смежные вопросы