เหตุใด“ _” (ขีดล่าง) จึงจับคู่“ -” (ยัติภังค์)


110

ฉันต้องค้นหาคู่มือ PDF โดยใช้แบบสอบถามนี้:

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)

ทำไมฉันจึงเห็นคนที่มีขีดกลางเมื่อฉันระบุชื่อที่จะเป็นtaz_manual%.pdf?

คำตอบ:


231

เนื่องจากขีดล่าง_เป็นสัญลักษณ์แทนเช่นเปอร์เซ็นต์%ยกเว้นว่าจะมองหาเพียงอักขระเดียวเท่านั้น

การจับคู่รูปแบบ SQL ช่วยให้คุณสามารถใช้ "_" เพื่อจับคู่อักขระเดี่ยวและ "%" เพื่อจับคู่อักขระตามจำนวนที่กำหนด (รวมถึงอักขระศูนย์)

(จากหัวข้อ3.3.4.7 การจับคู่รูปแบบในเอกสาร MySQL)

หากคุณต้องการใช้เครื่องหมายขีดล่างlikeเป็นตัวอักษรคุณต้องหลีกเลี่ยง:

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

afaik สิ่งนี้จะเกี่ยวข้องเมื่อคุณอยู่ในบริบทของรูปแบบเท่านั้น เช่นในLIKEคำสั่ง เมื่อแทนที่ทั้งหมด_ด้วย-: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. ขอให้สังเกตภายในหลบหนีและไม่มีการหลบหนีอยู่ภายในLIKE REPLACE(ฉันคิดว่ามันแปลกแม้ว่าคุณจะไม่ได้อยู่ในบริบทรูปแบบภายในแทนที่ ... )
Hafenkranich

@Hafenkranich จากเอกสาร mysql: "ใช้ตัวดำเนินการเปรียบเทียบ LIKE หรือ NOT LIKE"
Book Of Zeus

2

ฉันมีปัญหาคล้ายกันกับช่องว่างและขีดกลางขณะจับคู่สตริงที่มีการจับคู่แบบตรงทั้งหมด:

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

ข้อความค้นหาข้างต้นไม่ส่งคืนระเบียนใด ๆ ใน MySQL ฉันต้องหนีช่องว่างและขีดกลางและใช้LIKEแทนการจับคู่แบบตรงทั้งหมดด้วยเท่ากับ (=) ดังนี้:

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

แน่ใจหรือว่าเกี่ยวข้องกัน อาจจะไม่มีแถวตำแหน่งที่มีชื่อตรงนี้ ... ???
Nico Haase

ใช่มีแถวที่มีตำแหน่ง = 'IND - HQ' และด้านบนได้แก้ไขปัญหาที่ต้องเผชิญ
NBhat

และคุณรู้ไหมว่าเพราะคุณเคยถามคนที่มีคำถามนี้เมื่อห้าปีก่อนที่คุณจะโพสต์คำตอบของคุณ?
Nico Haase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.