Dlaczego „_” (podkreślenie) pasuje do „-” (łącznik)?

110

Muszę poszukać instrukcji w formacie PDF za pomocą tego zapytania:

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)

Dlaczego widzę tę z myślnikami, kiedy określam nazwę taz_manual%.pdf?

NA PRZYKŁAD
źródło

Odpowiedzi:

231

Ponieważ podkreślenie _jest symbolem wieloznacznym, podobnie jak procent %, z wyjątkiem tego, że szuka tylko jednego znaku.

Dopasowywanie wzorców SQL umożliwia użycie znaku „_” do dopasowania dowolnego pojedynczego znaku i „%” do dopasowania dowolnej liczby znaków (w tym znaków zerowych).

(Z sekcji 3.3.4.7. Dopasowywanie wzorców w dokumentacji MySQL).

Jeśli chcesz użyć podkreślenia likejako dosłownego, musisz go opuścić:

select * from a where name like '%taz\_manual%.pdf%';
Księga Zeusa
źródło
afaik ma to znaczenie tylko wtedy, gdy jesteś w kontekście wzorca. np. wewnątrz LIKEwyciągu. Przy wymianie wszystko _ze związkiem -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Zwróć uwagę na ucieczkę do środka LIKEi brak ucieczki do środka REPLACE. (Uważam jednak za dziwne, że nie jesteś w kontekście wzorca wewnątrz zamień ...)
Hafenkranich
@Hafenkranich z dokumentu mysql: „użyj operatorów porównania LIKE or NOT LIKE”
Book Of Zeus
2

Miałem podobny problem ze spacjami i łącznikami podczas dopasowywania ciągów z dopasowaniem ścisłym:

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

Powyższe zapytanie nie zwróciło żadnych rekordów w MySQL. Musiałem uniknąć spacji i łączników i użyć LIKEzamiast dokładnego dopasowania z równymi (=) w następujący sposób:

SELECT id FROM location WHERE name LIKE 'IND_\-_HQ';
NBhat
źródło
Czy na pewno to jest powiązane? Może nie było wiersza lokalizacji z taką dokładną nazwą ... ???
Nico Haase
tak, były wiersze z lokalizacją = „IND - HQ”, a powyższe rozwiązało problem
UWAGA
Wiesz o tym, ponieważ zadałeś osobie, która zadała to pytanie pięć lat przed opublikowaniem odpowiedzi?
Nico Haase