"_" (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.