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?

MISALNYA
sumber

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%';
Buku Zeus
sumber
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';
NBhat
sumber
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