MySQL LIKE 语句中下划线被误匹配的问题与解决方法

Felix
Felix
发布时间:2026-10-13| 3人浏览过
原创

在 MySQL 查询中,使用 LIKE 语句时经常遇到“下划线陷阱”:本意是想用 'exp_site_10_%' 精准匹配固定前缀,结果却错误返回了大量包含非下划线字符的记录。这是由 SQL 标准中将下划线定义为"单一字符占位符"引起的。解决此问题的核心方法是在查询语句中对下划线进行转义。

现象描述

假设数据库中有一个名为 action_conf 的表,存储着一系列系统配置的键名(en_name),具体表现如下图所示:

如果此时你希望获取所有以 exp_site_10_ 开头的配置项,第一反应通常会写出如下 SQL:

select en_name from action_conf where en_name like 'exp_site_10_%'

如果在 phpMyAdmin 或 Navicat 等客户端工具中自信地执行这条 SQL,会发现输出的结果并不理想:它不仅返回了以 exp_site_10_ 开头的条目,甚至连类似 expSite10_、exp-site_10_ 这种中间使用了其他符号的记录也一并列出来了。

原因分析

导致这种偏差的根本原因在于 LIKE 操作符对通配符的处理规则。

  • 百分号 %:代表零个、一个或多个任意字符。
  • 下划线 _:**仅代表恰好一个任意字符**。

当你在搜索条件中输入 'exp_site_10_%' 时,MySQL 引擎并不是在查找“字面上带有下划线的字符串”,而是在执行逻辑:
“前三个字符是 exp,第四个字符是任意值,接着是 site,第七个字符是任意值...”。这相当于 exp?site?10_?(问号代表任意一个字符)。

正确的操作方法:下划线转义

既然知道了是通配符导致的越界匹配,那么解决方式就是告诉 MySQL:“这里的下划线只是普通字符,不要把它当做占位符处理”。在 MySQL 中,可以通过在前面增加反斜杠 \ 来进行转义。

修改后的正确 SQL 语句应为:

select en_name from action_conf where en_name like 'exp\_site\_10\_%'

在执行该语句后,你就会得到预期的、完全符合 exp_site_10_ 开头模式的纯净结果列表。

补充说明:如何自定义转义符

如果你不想在查询语句中写满丑陋的反斜杠,可以使用 ESCAPE 关键字自定义一个转义标识:

-- 使用感叹号 ! 作为转义符
select en_name from action_conf 
where en_name like 'exp!_site!_10!_%' escape '!';

这样,只有紧跟在 ! 后面的 _ 才会被当成普通字符。

进阶:MySQL LIKE 常用通配符汇总

在实际编写模糊查询(Fuzzy Search)时,了解底层通配符行为能避免更多隐蔽 Bug:

  • % (百分号):替代零个、一个或多个字符。例如 'a%' 会匹配 'apple', 'ant', 'a'。
  • _ (下划线):仅替代一个字符。例如 's_th' 会匹配 'star', 'south',但不会匹配 'sat' (长度不足) 或 'short' (长度超限)。
  • [charlist] (方括号):用于匹配字符列表中任意一个单一字符。例如 '[ABC]' 匹配 A、B 或 C。
  • [^charlist] 或 [!charlist] (取反):不匹配指定列表中的任一字符。

以上就是针对 MySQL 中 `LIKE` 模糊查询时,关于下划线通配符引发的常见报错和修正方法的详细内容,更多关于数据库查询优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。