MySQL数据库中正则表达式(Regex)和like的区别详析
核心区别:通配符 vs 模式语言
LIKE:使用简单的通配符%:匹配任意多个字符(包括0个)_:匹配单个字符
正则表达式:使用完整的模式描述语言
具体对比
1.匹配能力对比
| 需求场景 | LIKE 实现 | 正则表达式实现 | 说明 |
|---|---|---|---|
| 以"A"开头 | LIKE 'A%' | ^A | 两者都能做到 |
| 包含"abc" | LIKE '%abc%' | abc | 两者都能做到 |
| 精确5个字符 | LIKE '_____' | ^.{5}$ | LIKE需要5个_,不直观 |
| 数字开头 | ❌ 无法实现 | ^\d | LIKE无法匹配"任意数字" |
| 邮箱验证 | ❌ 极其困难 | ^\w+@\w+\.\w+$ | LIKE难以精确匹配 |
| 密码强度 | ❌ 无法实现 | ^(?=.*[A-Z])(?=.*\d).{8,}$ | LIKE无法做前瞻断言 |
2.实际案例演示
假设我们有一个用户表,要查找符合以下条件的用户名:
需求:找到以数字开头,第三个字符是元音字母,总长度至少为5的用户名
sql
-- 使用 LIKE 几乎不可能实现
-- 我们需要枚举所有可能性:
SELECT * FROM users WHERE
name LIKE '0_a%' OR
name LIKE '1_a%' OR
name LIKE '2_a%' OR
-- ... 需要写30种组合,极其繁琐!
name LIKE '9_u%';
-- 使用正则表达式 一行搞定
SELECT * FROM users WHERE name REGEXP '^[0-9].[aeiou].{2,}';
-- 解释:^[0-9] 数字开头, . 任意字符, [aeiou] 元音字母, .{2,} 至少2个任意字符3.性能考虑
LIKE:在固定开头的情况下(如'A%')可以利用索引,性能较好正则表达式:通常无法利用索引,全表扫描,性能较差
sql
-- 能利用索引(如果name有索引) SELECT * FROM users WHERE name LIKE 'John%'; -- 不能利用索引 SELECT * FROM users WHERE name LIKE '%John%'; SELECT * FROM users WHERE name REGEXP 'John';
4.适用场景总结
| 场景 | 推荐使用 | 原因 |
|---|---|---|
| 简单前缀/后缀匹配 | LIKE | 语法简单,可能利用索引 |
| 固定格式匹配 | LIKE | 如 LIKE 'ABC____' |
| 复杂模式匹配 | 正则表达式 | 如邮箱、电话、特定模式 |
| 数据验证 | 正则表达式 | 如密码强度、格式检查 |
| 数据提取 | 正则表达式 | 如从文本中提取特定模式 |
结论
您的观察是对的——对于简单的模式匹配,LIKE 确实可以做到,而且应该优先使用,因为它的性能可能更好。
但是当需求变得复杂时:
LIKE就像是一把螺丝刀——适合简单的拧螺丝工作正则表达式就像是一个多功能工具箱——能处理各种复杂的维修任务
经验法则:
能用
LIKE解决的简单问题,就用LIKE当
LIKE需要写很长的OR条件或者根本无法实现时,就使用正则表达式
在实际的数据库工作中,两者都是重要的工具,根据具体需求选择合适的使用才是关键!
到此这篇关于MySQL数据库中正则表达式(Regex)和like区别的文章就介绍到这了,更多相关MySQL正则表达式Regex和like区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案
MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常2012-11-11
mysql 使用inet_aton和inet_ntoa处理ip地址数据的实例
下面小编就为大家带来一篇mysql 使用inet_aton和inet_ntoa处理ip地址数据的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-04-04
MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别整理
这篇文章主要介绍了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别整理,非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-08-08


最新评论