【问题标题】:Why does "_" (underscore) match "-" (hyphen)?为什么“_”(下划线)匹配“-”(连字符)?
【发布时间】:2012-01-04 10:16:20
【问题描述】:

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

【问题讨论】:

    标签: mysql wildcard


    【解决方案1】:

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

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

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

    如果你想使用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 文档:“使用 LIKE 或 NOT LIKE 比较运算符”
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你确定这有关系吗?也许没有具有此确切名称的位置行...???
    • 是的,存在 location='IND - HQ' 的行,上面确实解决了所面临的问题
    • 您知道这一点是因为您在发布答案五年前就问过这个问题的人?
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多