Почему "_" (подчеркивание) соответствует "-" (дефис)?

Мне нужно искать руководство по PDF, используя этот запрос:

[email protected]: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)

Почему я вижу тире с тире, когда я указываю имя taz_manual%.pdf?

Ответ 1

Поскольку подчеркивание _ является подстановочным знаком, таким как процент %, за исключением того, что он ищет только один символ.

Сравнение шаблонов SQL позволяет использовать "_" для соответствия любому одиночному символу и "%" для соответствия произвольному количеству символов (включая нулевые символы).

(Из раздела 3.3.4.7 Соответствие шаблонов в документации по MySQL.)

Если вы хотите использовать символ подчеркивания в like как литерал, вам нужно его избежать:

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

Ответ 2

У меня была аналогичная проблема с пространством и дефисами при совпадении строк с точным соответствием:

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

Вышеуказанный запрос не возвратил никаких записей в MySQL. Мне пришлось избегать пробелов и дефисов и использовать LIKE вместо точного совпадения с equals (=) следующим образом:

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