为什么“ _”(下划线)与“-”(连字符)匹配?


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

Answers:


231

因为下划线_是一个类似百分号的通配符%,只不过它只查找一个字符。

SQL模式匹配使您可以使用“ _”来匹配任何单个字符,并使用“%”来匹配任意数量的字符(包括零个字符)。

(来自MySQL文档中的3.3.4.7。模式匹配。)

如果要将下划线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

来自mysql doc的@Hafenkranich:“使用LIKE或NOT LIKE比较运算符”
Zeus图书

2

在使用完全匹配的字符串进行匹配时,我在空格和连字符上遇到了类似的问题:

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

上面的查询未在MySQL中返回任何记录。我必须转义空格和连字符,并使用LIKE等号(=)代替完全匹配,如下所示:

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

您确定这是相关的吗?也许没有确切名称的位置行... ???
Nico Haase

是的,有些行的位置为“ IND-HQ”,以上内容确实解决了所面临的问题
NBhat

您知道吗,因为您在发布答案之前五年就问过这个问题的人了?
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.