2011-12-20 85 views
5

Thật thất vọng với việc thoát mẫu của MySQL được sử dụng trong toán tử LIKE.Toán tử MySQL LIKE với ký tự đại diện và dấu gạch chéo ngược

[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) 

Theo tài liệu MySQL: http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like %\\\\% là toán hạng phải, nhưng tại sao nó không đạt kết quả?

EDIT: Cơ sở dữ liệu tôi đang thử nghiệm trong đó có character_set_database được đặt thành utf8. Để tiếp tục điều tra của tôi, tôi đã tạo cùng một thiết lập trong cơ sở dữ liệu có ký tự character_set_database được đặt thành latin1 và đoán công thức nào, '%\\\\%' hoạt động!

EDIT: Sự cố có thể được sao chép và đó là vấn đề đối chiếu trường. Thông tin chi tiết: http://bugs.mysql.com/bug.php?id=63829

+0

Khi tôi sử dụng lệnh của bạn chính xác, 'chọn * từ foo nơi tên giống như '% \\\\%';' hoạt động cho tôi. Tôi đang ở một mất mát là tại sao nó không làm việc cho bạn mặc dù, tôi tò mò muốn biết. –

+0

Nó có thể có một cái gì đó để làm với bộ ký tự cơ sở dữ liệu. Tôi đã cập nhật bài đăng gốc. – EnToutCas

+0

Kiểm tra điều này: - 'select @@ session.sql_mode; chọn @@ global.sql_mode; ' – ajreal

Trả lời

0

Có vẻ như nó có một số liên quan đến rằng lỗi MySQL: http://bugs.mysql.com/bug.php?id=46659

Tôi nghĩ rằng bạn kết nối với mysql không xác định đúng --character-set-server tùy chọn (mặc định là latin1 với chiếu latin1_swedish_ci), và có utf-8 như hiện nay bộ ký tự của bảng điều khiển. Điều đó gây ra các chuyển đổi và so sánh char không chính xác khi bạn xử lý dữ liệu cần được chuyển đổi thành utf8 từ bộ ký tự của --character-set-server.

2

Trong MySQL 5.6.10, với collation trường văn bản utf8mb4_unicode_520_ci này có thể đạt được bằng cách sử dụng 5 ký tự gạch chéo ngược thay vì 4, ví dụ:

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

Bằng cách nào đó, chống lại tất cả sự mong đợi, điều này đúng tìm thấy tất cả các hàng với dấu gạch chéo ngược. Ít nhất điều này sẽ làm việc cho đến khi lỗi collation trường MySQL ở trên là cố định. Xem xét nó đã được hơn 5 năm kể từ khi lỗi được phát hiện, bất kỳ ứng dụng được thiết kế với điều này có thể sống lâu hơn tính hữu ích của nó trước khi MySQL thậm chí còn cố định - vì vậy phải là một giải pháp khá đáng tin cậy.

0

Với MySQL 5.0.12 dev trên Windows 10 Tôi có kết quả như sau khi tôi thay đổi các truy vấn từ

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

để

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

nó hoạt động nhưng các chuỗi đầu tiên với dấu gạch chéo là nội dung trường gốc. Dường như đã giải thích dấu gạch chéo về phía trước là dấu gạch chéo ngược.

Các vấn đề liên quan