Tại sao “_” (gạch dưới) khớp với “-” (gạch nối)?


110

Tôi phải tìm sách hướng dẫn PDF bằng cách sử dụng truy vấn này:

root@localhost:test> select * from a where name like '%taz_manual%.pdf%';
+--------------------+------------------+-------------+
| name               | description      |        size | 
+--------------------+------------------+-------------+
| taz-manual-1.1.pdf | Manual v1.0 TA-Z |    31351902 |
| taz-manual-0.2.pdf | Manual v1.0 T1-A |     3578278 |
| taz_manual-2.0.pdf | Manual v2.0 GA-X |   542578278 |
etc........
+--------------------+------------------+-------------+
132 row in set (0.00 sec)

Tại sao tôi nhìn thấy một cái có dấu gạch ngang khi tôi chỉ định tên taz_manual%.pdf?

Câu trả lời:


231

Bởi vì dấu gạch dưới _là một ký tự đại diện giống như phần trăm %, ngoại trừ việc nó chỉ tìm kiếm một ký tự.

Đối sánh mẫu SQL cho phép bạn sử dụng "_" để khớp với bất kỳ ký tự đơn nào và "%" để khớp với một số ký tự tùy ý (bao gồm cả ký tự 0).

(Từ phần 3.3.4.7. Khớp mẫu trong tài liệu MySQL.)

Nếu bạn muốn sử dụng dấu gạch dưới dưới likedạng một chữ, bạn phải thoát khỏi nó:

select * from a where name like '%taz\_manual%.pdf%';

afaik điều này chỉ phù hợp khi bạn đang ở trong một bối cảnh mẫu. ví dụ: bên trong một LIKEcâu lệnh. Khi thay thế tất cả _với một -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Chú ý thoát bên trong LIKEvà không thoát bên trong REPLACE. (Tôi thấy nó mặc dù kỳ lạ mà bạn đang không ở trong một bối cảnh mô hình bên trong thay thế ...)
Hafenkranich

@Hafenkranich từ mysql doc: "sử dụng các toán tử so sánh NHƯ hoặc không thích"
Book Of Zeus

2

Tôi đã gặp sự cố tương tự với dấu cách và dấu gạch nối khi khớp các chuỗi với đối sánh chính xác:

SELECT id FROM location WHERE name = 'IND - HQ';

Truy vấn trên không trả về bất kỳ bản ghi nào trong MySQL. Tôi đã phải thoát khỏi dấu cách và dấu gạch nối và sử dụng LIKEthay vì đối sánh chính xác bằng dấu bằng (=) như sau:

SELECT id FROM location WHERE name LIKE 'IND_\-_HQ';

Bạn có chắc điều này có liên quan? Có lẽ không có hàng vị trí nào có tên chính xác này ... ???
Nico Haase,

vâng, có các hàng có vị trí = 'IND - HQ' và hàng ở trên đã khắc phục được sự cố gặp phải
NBhat

Và bạn biết điều đó bởi vì bạn đã hỏi người có câu hỏi này 5 năm trước khi bạn đăng câu trả lời của mình?
Nico Haase,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.