在 MySQL 中,REGEXP
和 LIKE
都用于字符串模式匹配,但它们的语法、功能和性能有所不同。以下是详细的比较:
1. 语法与匹配能力
LIKE
- 通配符:仅支持两种通配符:
%
:匹配任意数量(包括零个)的任意字符。_
:匹配单个任意字符。WHERE s_name LIKE '张%'; -- 以 "张" 开头 WHERE s_name LIKE '%明'; -- 以 "明" 结尾 WHERE s_name LIKE '_明'; -- 第二个字符是 "明"(如 "赵明")
REGEXP
- 正则表达式:支持完整的正则表达式语法,功能更强大:
^
:匹配字符串开头。$
:匹配字符串结尾。[]
:字符类(如[abc]
匹配a
、b
或c
)。*
、+
、?
、{n}
:重复次数限定符。|
:或操作(如a|b
匹配a
或b
)。\b
:单词边界。-
WHERE s_name REGEXP '^张'; -- 以 "张" 开头 WHERE s_name REGEXP '明$'; -- 以 "明" 结尾 WHERE s_name REGEXP '[0-9]'; -- 包含数字
2. 性能差异
LIKE
:- 前缀匹配(
LIKE '张%'
):可以利用索引,性能较好。 - 后缀或中间匹配(
LIKE '%张'
或LIKE '%张%'
):无法利用索引,需全表扫描,性能较差。
- 前缀匹配(
REGEXP
:- 不支持索引优化:无论模式如何,都需要逐行检查,性能通常低于
LIKE
,尤其是大数据量时。
- 不支持索引优化:无论模式如何,都需要逐行检查,性能通常低于
-
3. 大小写敏感性
LIKE
:- 默认与表的字符集排序规则(collation)一致。例如:
utf8_general_ci
:不区分大小写。utf8_bin
:区分大小写。
- 使用
LIKE BINARY
可强制区分大小写。
- 默认与表的字符集排序规则(collation)一致。例如:
REGEXP
:- 默认不区分大小写。
- 使用
REGEXP BINARY
可强制区分大小写。
4. 适用场景
场景 | 推荐使用 | 原因 |
---|---|---|
简单前缀 / 后缀匹配 | LIKE | 语法简单,前缀匹配可利用索引,性能更佳。 |
复杂模式匹配(如数字、特殊字符) | REGEXP | LIKE 无法表达复杂模式(如 [0-9] 、\b )。 |
需要正则表达式的高级功能 | REGEXP | 如字符类、重复限定符、或操作等。 |
总结
- 优先使用
LIKE
:如果需求能用%
和_
表达(如简单的前缀 / 后缀匹配)。 - 使用
REGEXP
:当LIKE
无法满足复杂模式匹配需求时。 - 性能考虑:避免在
LIKE
或REGEXP
中使用前缀通配符(如%张
),因为会导致全表扫描。