在 MySQL 中,LIKE
和 REGEXP
都是用于字符串模式匹配的运算符,但它们在功能、语法和适用场景上存在显著差异。以下是两者的详细对比:
🧩 一、基本概念与语法
-
LIKE
运算符- 功能:用于简单模式匹配,仅支持两种通配符:
%
:匹配任意数量字符(包括零个字符)。_
:匹配单个字符。
- 语法示例:
-- 匹配以 "a" 开头的字符串 SELECT * FROM table WHERE column LIKE 'a%'; -- 匹配第二个字符为 "b" 的字符串 SELECT * FROM table WHERE column LIKE '_b%';
- 特点:需匹配整列值(如
'杨%'
匹配以“杨”开头的完整字符串)。
- 功能:用于简单模式匹配,仅支持两种通配符:
-
REGEXP
运算符- 功能:支持正则表达式,提供复杂模式匹配能力。常用符号包括:
.
:任意单个字符*
:前字符零次或多次+
:前字符一次或多次^
/$
:字符串开头/结尾[abc]
:匹配括号内任意字符|
:逻辑“或”
- 语法示例:
-- 匹配以 "a" 开头或 "z" 结尾的字符串 SELECT * FROM table WHERE column REGEXP '^a|z$'; -- 匹配包含 "a" 后接任意字符再跟 "b" 的字符串 SELECT * FROM table WHERE column REGEXP 'a.b';
- 特点:可匹配列值中的部分内容(如
'杨'
可匹配任意包含“杨”的字符串)。
- 功能:支持正则表达式,提供复杂模式匹配能力。常用符号包括:
⚙️ 二、核心区别
维度 | LIKE | REGEXP |
---|---|---|
匹配能力 | 简单模式(仅 % 和 _ ) | 复杂正则表达式(支持多种元字符) |
匹配范围 | 必须匹配整列值(如 '杨%' ) | 可匹配部分值(如 '杨' 即匹配) |
性能 | 模式开头无通配符时可利用索引,效率较高 | 不支持索引,通常全表扫描,性能较低 |
大小写敏感 | 取决于数据库配置(默认不敏感) | 可通过 BINARY 关键字强制区分大小写 |
学习成本 | 简单直观 | 需掌握正则表达式语法 |
⚡ 三、性能影响
LIKE
:- 当模式以通配符开头(如
'%abc'
)时,无法使用索引,需全表扫描。 - 优化建议:避免在模式开头使用
%
,或改用全文索引(FULLTEXT
)。
- 当模式以通配符开头(如
REGEXP
:- 始终无法使用索引,大数据集时性能较差。
- 优化建议:简化正则表达式,或结合外部工具预处理数据。
🧪 四、典型应用场景
-
适合
LIKE
的情况:- 简单前缀/后缀匹配(如
'张%'
匹配姓氏)。 - 固定位置字符匹配(如
'_b%'
匹配第二个字符为 “b”)。 - 数据量较大且模式简单时(利用索引优化)。
- 简单前缀/后缀匹配(如
-
适合
REGEXP
的情况:- 复杂模式(如邮箱格式验证:
'^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$'
)。 - 逻辑组合匹配(如包含 “error” 或 “warning”:
'error|warning'
)。 - 特定字符集匹配(如仅数字:
'^[0-9]+$'
)。
- 复杂模式(如邮箱格式验证:
💎 五、总结与建议
- 优先
LIKE
:当需求为简单文本匹配(前缀、后缀、固定长度)且需考虑性能时。 - 选择
REGEXP
:当匹配规则复杂(如格式校验、多条件逻辑)且数据量可控时。 - 混合使用:部分场景可结合两者(如先用
LIKE
过滤前缀,再用REGEXP
细化匹配)。
示例代码对比:
-- LIKE:匹配以 "北" 开头、"号" 结尾的地址 SELECT * FROM customers WHERE address LIKE '北%号'; -- REGEXP:匹配包含 "路" 或 "街" 的地址 SELECT * FROM customers WHERE address REGEXP '路|街';
通过合理选择运算符,可兼顾开发效率与查询性能 ✅。