web-dev-qa-db-fra.com

Pourquoi "_" (trait de soulignement) correspond à "-" (trait d'union)?

Je dois rechercher un PDF manuel utilisant cette requête:

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)

Pourquoi est-ce que je vois celui avec des tirets quand je spécifie le nom pour être taz_manual%.pdf?

110
E.G.

Parce que le trait de soulignement _ est un caractère générique tel que le pourcentage %, sauf qu'il ne cherche qu'un seul caractère.

La correspondance de modèle SQL vous permet d'utiliser "_" pour rechercher un seul caractère et "%" pour rechercher un nombre arbitraire de caractères (y compris zéro caractère).

(De la section .3.4.7. Pattern Matching dans la documentation MySQL.)

Si vous voulez utiliser le trait de soulignement dans like comme un littéral, vous devez y échapper:

select * from a where name like '%taz\_manual%.pdf%';
231
Book Of Zeus

J'ai eu un problème similaire avec l'espace et les traits d'union lors de la correspondance des chaînes avec la correspondance exacte:

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

La requête ci-dessus n'a renvoyé aucun enregistrement dans MySQL. J'ai dû échapper aux espaces et aux tirets et utiliser LIKE au lieu de la correspondance exacte avec égal (=) comme suit:

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