Pourquoi «_» (trait de soulignement) correspond-il à «-» (trait d’union)?

Je dois rechercher un manuel PDF en 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 taz_manual%.pdf ?

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

    La correspondance de modèle SQL vous permet d’utiliser “_” pour correspondre à n’importe quel caractère et “%” pour correspondre à un nombre arbitraire de caractères (y compris zéro caractère).

    (De la section 3.3.4.7. Correspondance des modèles dans la documentation MySQL.)

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

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

    J’ai eu un problème similaire avec l’espace et les traits d’union tout en faisant correspondre les 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 des égaux (=) comme suit:

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