Perché "_" (trattino basso) corrisponde a "-" (trattino)?


110

Devo cercare un manuale PDF usando questa query:

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)

Perché vedo quello con i trattini quando specifico il nome taz_manual%.pdf?

Risposte:


231

Perché il trattino basso _è un carattere jolly come la percentuale %, tranne per il fatto che cerca solo un carattere.

La corrispondenza del modello SQL consente di utilizzare "_" per trovare la corrispondenza con qualsiasi carattere singolo e "%" per trovare una corrispondenza con un numero arbitrario di caratteri (inclusi zero caratteri).

(Dalla sezione 3.3.4.7. Pattern Matching nella documentazione di MySQL.)

Se vuoi usare il carattere di sottolineatura likecome letterale, devi evitarlo:

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

afaik questo è rilevante solo quando sei in un contesto di pattern. ad esempio all'interno di una LIKEdichiarazione. Quando si sostituisce tutte _con -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Notare la fuga all'interno LIKEe nessuna fuga all'interno REPLACE. (Trovo strano però che tu non sia in un contesto di pattern all'interno di sostituire ...)
Hafenkranich

@Hafenkranich dal documento mysql: "usa gli operatori di confronto LIKE o NOT LIKE"
Book Of Zeus

2

Ho avuto un problema simile con lo spazio e i trattini durante la corrispondenza delle stringhe con la corrispondenza esatta:

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

La query precedente non ha restituito alcun record in MySQL. Ho dovuto sfuggire agli spazi e ai trattini e utilizzare LIKEinvece della corrispondenza esatta con uguale (=) come segue:

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

Sei sicuro che sia correlato? Forse non c'era una riga di località con questo nome esatto ... ???
Nico Haase

sì, c'erano righe con location = 'IND - HQ' e quanto sopra ha risolto il problema affrontato
NBhat

E lo sai perché hai chiesto alla persona che aveva questa domanda cinque anni prima di pubblicare la tua risposta?
Nico Haase
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.