"_" (Alt çizgi) neden "-" (kısa çizgi) ile eşleşiyor?


110

Bu sorguyu kullanarak bir PDF kılavuzu aramalıyım:

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)

Adı belirttiğimde neden kısa çizgi olanı görüyorum taz_manual%.pdf?

Yanıtlar:


231

Çünkü alt çizgi _, yüzde gibi bir joker karakterdir %, tek farkı yalnızca bir karakteri arar.

SQL kalıp eşleştirmesi, herhangi bir tek karakteri eşleştirmek için "_" ve rastgele sayıda karakteri (sıfır karakterler dahil) eşleştirmek için "%" kullanmanıza olanak tanır.

( MySQL belgelerinde 3.3.4.7. Kalıp Eşleştirme bölümünden .)

likeAlt çizgiyi gerçek olarak kullanmak istiyorsanız, ondan kaçınmanız gerekir:

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

afaik bu yalnızca bir kalıp bağlamında olduğunuzda geçerlidir. örneğin bir LIKEifadenin içinde . Tüm değiştirirken _bir ile -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. İçeriden kaçışa LIKEve içeriden kaçışa dikkat edin REPLACE. (Değiştirin içinde bir kalıp bağlamında olmamanıza rağmen garip buluyorum ...)
Hafenkranich

Mysql belgesinden @Hafenkranich: "karşılaştırma operatörlerini LIKE or NOT LIKE kullanın"
Book Of Zeus

2

Dizeleri tam eşleme ile eşleştirirken boşluk ve kısa çizgilerle ilgili benzer bir sorun yaşadım:

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

Yukarıdaki sorgu MySQL'de herhangi bir kayıt döndürmedi. Boşluklardan ve kısa çizgilerden kaçmalı ve şuna LIKEeşit (=) ile tam eşleşme yerine aşağıdaki gibi kullanmalıydım:

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

Bunun ilgili olduğundan emin misin? Belki de tam olarak bu ada sahip bir konum satırı yoktu ... ???
Nico Haase

evet, konum = 'IND - HQ' olan satırlar vardı ve yukarıdakiler karşılaşılan sorunu çözdü
NBhat

Bunu, cevabınızı göndermeden beş yıl önce bu soruyu soran kişiye sorduğunuz için mi biliyorsunuz?
Nico Haase 18
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.