Чому "_" (підкреслення) відповідає "-" (дефіс)?


110

Мені потрібно шукати посібник PDF за допомогою цього запиту:

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)

Чому я бачу ту, що має тире, коли я вказую ім'я, яке має бути taz_manual%.pdf?

Відповіді:


231

Оскільки підкреслення _- це підкреслення , подібне відсоткам %, за винятком того, що він шукає лише одного символу.

Узгодження шаблону SQL дозволяє використовувати "_" для відповідності будь-якому одному символу та "%" для довільної кількості символів (включаючи нульові символи).

(З розділу 3.3.4.7. Зіставлення шаблонів у документації на MySQL.)

Якщо ви хочете використовувати підкреслення в likeпрямому сенсі, вам слід уникнути цього:

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

afaik це актуально лише тоді, коли ви знаходитесь у контексті шаблону. наприклад, всередині LIKEзаяви. При заміні всіх _з -: UPDATE sys_file set identifier = REPLACE(identifier, '_', '-') WHERE identifier LIKE '%\_%';. Помічайте втечу всередині LIKEі не втечу всередину REPLACE. (Мені здається дивним, хоча ти не в контексті шаблону всередині заміни ...)
Hafenkranich

@Hafenkranich з mysql doc: "використовуйте оператори порівняння LIKE або NOT LIKE"
Book Of Zeus

2

У мене була схожа проблема з пробілом і дефісами, під час узгодження рядків з точною відповідністю:

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

The above query didn't return any records in MySQL. I had to escape the spaces and hyphens and use LIKE instead of exact match with equals (=) as follows:

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

Are you sure this is related? Maybe there was no location row with this exact name...???
Nico Haase

yes, there were rows with location='IND - HQ' and the above did fix the issue faced
NBhat

And you know that because you've asked the person who had this question five years before you've posted your answer?
Nico Haase
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.