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


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.