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

时间:2011-11-23 03:00:58

标签: mysql wildcard

我必须使用此查询查找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时,为什么我会看到带破折号的那个?

2 个答案:

答案 0 :(得分:229)

因为下划线_是百分比%的通配符,除了它只查找一个字符。

  

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

(来自MySQL文档中的3.3.4.7. Pattern Matching部分。)

如果你想在like中使用下划线作为文字,你必须逃避它:

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

答案 1 :(得分:2)

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

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

上述查询未返回MySQL中的任何记录。我不得不逃避空格和连字符并使用LIKE而不是与equals(=)完全匹配,如下所示:

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