Por que “_” (sublinhado) corresponde a “-” (hífen)?

110

Tenho que procurar um manual em PDF usando esta consulta:

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)

Por que estou vendo aquele com traços quando especifico o nome a ser taz_manual%.pdf?

POR EXEMPLO
fonte

Respostas:

231

Porque o sublinhado _é um caractere curinga como a porcentagem %, exceto que procura apenas um caractere.

A correspondência de padrão SQL permite que você use "_" para corresponder a qualquer caractere único e "%" para corresponder a um número arbitrário de caracteres (incluindo zero caracteres).

(Da seção 3.3.4.7. Correspondência de padrões na documentação do MySQL.)

Se você quiser usar o sublinhado likecomo literal, você deve escapar dele:

select * from a where name like '%taz\_manual%.pdf%';
Livro de zeus
fonte
afaik, isso só é relevante quando você está em um contexto de padrão. por exemplo, dentro de uma LIKEdeclaração. Ao substituir tudo _com um -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Observe o escape interno LIKEe nenhum escape interno REPLACE. (Eu acho estranho que você não esteja em um contexto de padrão dentro de substituir ...)
Hafenkranich
@Hafenkranich do documento mysql: "use os operadores de comparação LIKE ou NOT LIKE"
Livro de Zeus
2

Tive um problema semelhante com espaço e hífens ao combinar strings com correspondência exata:

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

A consulta acima não retornou nenhum registro no MySQL. Tive que escapar os espaços e hifens e usar em LIKEvez da correspondência exata com igual (=) da seguinte maneira:

SELECT id FROM location WHERE name LIKE 'IND_\-_HQ';
NBhat
fonte
Tem certeza de que isso está relacionado? Talvez não houvesse nenhuma linha de localização com este nome exato ... ???
Nico Haase
sim, havia linhas com localização = 'IND - HQ' e o acima corrigiu o problema enfrentado
NBhat
E você sabe disso porque perguntou à pessoa que tinha essa pergunta cinco anos antes de postar sua resposta?
Nico Haase