Mengapa "_" (garis bawah) cocok dengan "-" (tanda hubung)?


110

Saya harus mencari manual PDF menggunakan kueri ini:

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)

Mengapa saya melihat salah satu dengan tanda hubung ketika saya menentukan namanya taz_manual%.pdf?

Jawaban:


231

Karena garis bawah _adalah wildcard seperti persen %, bedanya hanya mencari satu karakter.

Pencocokan pola SQL memungkinkan Anda menggunakan "_" untuk mencocokkan salah satu karakter dan "%" untuk mencocokkan jumlah karakter yang berubah-ubah (termasuk karakter nol).

(Dari bagian 3.3.4.7. Pencocokan Pola dalam dokumentasi MySQL.)

Jika Anda ingin menggunakan garis bawah likesebagai literal, Anda harus menghindarinya:

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

afaik ini hanya relevan jika Anda berada dalam konteks pola. misalnya di dalam LIKEpernyataan. Ketika mengganti semua _dengan -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Perhatikan bagian dalam melarikan diri LIKEdan tidak ada bagian dalam melarikan diri REPLACE. (Saya merasa aneh meskipun Anda tidak berada dalam konteks pola di dalam ganti ...)
Hafenkranich

@Hafenkranich dari mysql doc: "gunakan operator perbandingan LIKE or NOT LIKE"
Book Of Zeus

2

Saya memiliki masalah serupa dengan spasi dan tanda hubung saat mencocokkan string dengan pencocokan persis:

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

Kueri di atas tidak mengembalikan catatan apa pun di MySQL. Saya harus keluar dari spasi dan tanda hubung dan menggunakan LIKEbukan pencocokan tepat dengan sama dengan (=) sebagai berikut:

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

Apakah Anda yakin ini terkait? Mungkin tidak ada baris lokasi dengan nama persis seperti ini ... ???
Nico Haase

ya, ada baris dengan lokasi = 'IND - HQ' dan di atas memperbaiki masalah yang dihadapi
NBhat

Dan Anda tahu itu karena Anda telah menanyakan orang yang memiliki pertanyaan ini lima tahun sebelum Anda memposting jawaban Anda?
Nico Haase
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.