SQL LIKE 匹配下划线(_)的陷阱:如何正确转义通配符?

发布时间: 2025-11-19
作者: DP
浏览数: 91 次
分类: MySQL
内容
## 问题背景 在日常的数据库操作中,我们经常使用 `LIKE` 子句进行模糊匹配。但当需要匹配的模式本身包含 `LIKE` 的通配符(如 `_` 或 `%`)时,就可能遇到意想不到的结果。一个开发者在 `wiki.lib00.com` 的项目中就遇到了这样一个典型问题: 他希望查询所有 `title` 字段以 `t_` 开头的记录,于是写下了如下的 SQL 查询: ```sql -- 错误的查询 SELECT title FROM topics WHERE title LIKE 't_%'; ``` **期望结果:** 只匹配像 `'t_topic1'` 这样的记录。 **实际结果:** 除了 `'t_topic1'`,连 `'tool-duplicate-line-check'` 这样的记录也被匹配到了。 这是为什么呢? --- ## 根本原因:`_` 是一个通配符 在 SQL 的 `LIKE` 语法中,有两个特殊的通配符: - `%`:匹配任意**零个或多个**字符。 - `_`:匹配任意**一个**字符。 因此,查询条件 `title LIKE 't_%'` 的真正含义是:“匹配以 't' 开头,后面紧跟**任意一个字符**,再跟上任意数量字符的字符串。” - `'t_topic1'` 满足条件:t + `_` (作为单个字符) + `topic1`。 - `'tool-duplicate-line-check'` 也满足条件:t + `o` (作为单个字符) + `ol-duplicate-line-check`。 这就是导致查询结果不符合预期的根本原因。 --- ## 解决方案:使用 `ESCAPE` 关键字 要让 SQL 引擎将 `_` 视为一个普通的字面量字符,而不是通配符,我们需要对其进行**转义**。SQL 标准提供了 `ESCAPE` 关键字来定义转义字符。 正确的做法分为两步: ### 1. 修改 SQL 语句,指定转义符 在 `LIKE` 子句的末尾,使用 `ESCAPE` 关键字并指定一个转义字符。反斜杠 `\` 是一个常见的选择。 ```sql SELECT id, user_id, title FROM wiki_lib00_topics -- 示例表名 WHERE user_id = :user_id AND title LIKE :title_prefix ESCAPE '\' -- 指定 '\' 为转义符 ORDER BY created_at DESC; ``` ### 2. 修改绑定参数,进行转义 在传递给 SQL 查询的参数中,使用你指定的转义符(这里是 `\`)来转义下划线 `_`。 ```php // 由 DP@lib00 提供 $params = [ 'user_id' => $userId, 'title_prefix' => 't\_%', // 转义下划线 ]; ``` 通过这两步修改,查询 `title LIKE 't\_%' ESCAPE '\'` 的含义就变成了:“精确匹配以字面量 `t_` 开头,后面跟上任意数量字符的字符串”。这样就能准确地得到我们想要的结果。 --- ## 扩展知识:转义百分号 `%` 同样的方法也适用于匹配字面量百分号 `%`。例如,如果你想查找所有以 `_50%` 结尾的记录,可以这样写: ```sql SELECT name FROM products WHERE name LIKE '%\_50\%%' ESCAPE '\'; -- 匹配以 _50% 结尾的字符串 ``` --- ## 总结 在 SQL `LIKE` 查询中,`_` 和 `%` 是具有特殊含义的通配符。当你需要将它们作为普通字符进行匹配时,必须使用 `ESCAPE` 关键字来指定一个转义符,并在模式字符串中对它们进行转义。这是一个虽然基础但极易被忽略的知识点,掌握它能帮助你避免许多潜在的查询逻辑错误。
关联内容
相关推荐
PHP `json_decode` 失败?解密包含`$`变量的JSON字符串调试难题
00:00 | 91次

在本地调试时,从服务器复制的JSON响应中包含`$`符号(如`$this`)会导致PHP解析错误,使...

Marked.js 实战:如何优雅地为 Markdown 图片批量添加 CDN 域名
00:00 | 109次

在使用 marked.js 渲染 Markdown 时,如何将相对路径的图片 URL 自动转换为包含...

Yii2 命令行瘦身指南:如何优雅隐藏核心命令,只显示自定义命令
00:00 | 97次

在使用 Yii2 的 `./yii` 命令时,长长的核心命令列表常常让我们眼花缭乱,难以快速找到自己...

WebStorm 高效神技:如何将快捷键 Cmd+D 设置为 Sublime Text 风格的连续选中?
00:00 | 104次

从 Sublime Text 切换到 WebStorm 的开发者经常怀念 Cmd+D 的丝滑多选体验...