浅谈MySQL中字符串匹配的N种姿势

 更新时间:2025年05月29日 09:53:52   作者:AA-代码批发V哥  
本文主要介绍了浅谈MySQL中字符串匹配的N种姿势,包括LIKE、REGEXP、全文索引及SOUNDEX,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

前言

在MySQL数据库开发中,字符串匹配是高频需求。无论是用户搜索、数据清洗还是业务逻辑过滤,掌握高效的字符串匹配方法都至关重要。本文将结合实际场景,详细解析MySQL中字符串匹配的多种实现方式,涵盖基础语法、正则表达式、全文索引等核心知识点,帮助开发者快速定位最优解决方案。

一、模糊匹配:LIKE与通配符

  • LIKE 基本语法

LIKE 是 MySQL 中最常用的字符串匹配操作符,配合通配符实现模式匹配,语法如下:

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
  • 通配符详解

% 通配符(匹配任意字符序列)

查询姓 “张” 的用户(以"张"为前缀)
SELECT * FROM users WHERE username LIKE '张%';

匹配包含 “test” 的字符串(不区分位置)
SELECT * FROM logs WHERE message LIKE '%test%';

_ 通配符(匹配单个任意字符)

查询用户名恰好为 3 位,且以 “a” 开头的记录
SELECT * FROM users WHERE username LIKE 'a__';

注意事项性能:LIKE ‘%xxx%’ 无法利用索引,建议优化为前缀匹配(如 ‘xxx%’);
大小写敏感:默认不区分大小写,可通过 BINARY 关键字开启敏感匹配:

SELECT * FROM users WHERE username LIKE BINARY 'Ab%'; -- 区分大小写

二、正则表达式匹配:REGEXP

1.基础语法

MySQL 通过 REGEXP 操作符支持正则表达式匹配,语法如下:

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP pattern;

2.常用正则表达式模式

  • 字符匹配
  • ^:匹配字符串开头
-- 匹配以数字开头的字符串
SELECT * FROM data WHERE value REGEXP '^[0-9]';
  • $:匹配字符串结尾
-- 匹配以“.com”结尾的域名
SELECT * FROM urls WHERE domain REGEXP '\.com$';
  • 重复匹配
  • *:匹配前一个字符 0 次或多次
-- 匹配包含连续多个“a”的字符串
SELECT * FROM texts WHERE content REGEXP 'a*';
  • +:匹配前一个字符 1 次或多次
-- 匹配至少包含一个“a”的字符串
SELECT * FROM texts WHERE content REGEXP 'a+';
  • 分组与或操作
  • |:逻辑或
-- 匹配“male”或“female”
SELECT * FROM users WHERE gender REGEXP 'male|female';
  • ():分组
-- 匹配手机号(支持13/15/18开头)
SELECT * FROM contacts WHERE phone REGEXP '^1(3|5|8)[0-9]{9}$';

性能建议复杂正则表达式可能导致全表扫描,建议对匹配字段添加索引;
避免在表达式起始位置使用 ^ 以外的锚定符(如 $),以提升匹配效率。

三、全文索引匹配:FULLTEXT

  • 适用场景

当需要处理大量文本数据(如文章内容、日志信息)的模糊匹配时,FULLTEXT 索引是更优选择,相比 LIKE 和 REGEXP 具有更高的查询效率。

  • 创建全文索引
-- 创建表时添加全文索引
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
);

-- 对现有表添加全文索引
ALTER TABLE articles ADD FULLTEXT(title, content);
  • 使用 MATCH AGAINST 查询
-- 简单匹配(查询包含“MySQL”的文章)
SELECT * FROM articles 
WHERE MATCH(title, content) AGAINST('MySQL');

-- 布尔模式匹配(+必须包含,-排除)
SELECT * FROM articles 
WHERE MATCH(title, content) AGAINST('+优化 -索引' IN BOOLEAN MODE);

-- 自然语言模式(返回相关度排序结果)
SELECT *, MATCH(title, content) AGAINST('性能调优') AS score
FROM articles 
ORDER BY score DESC;

四、高级函数辅助匹配

  • SOUNDEX 函数(语音匹配)

用于匹配发音相似的字符串,适用于人名、地名的模糊搜索:

-- 查询发音与“Smith”相似的用户
SELECT * FROM users 
WHERE SOUNDEX(username) = SOUNDEX('Smith');
  • ELT 函数(枚举匹配)

根据索引值返回枚举值,常用于固定列表的快速匹配:

-- 根据状态码返回对应描述
SELECT id, ELT(status, '未开始', '进行中', '已完成') AS status_desc FROM tasks;

五、性能优化总结

匹配方式适用场景索引支持性能等级
LIKE + 前缀匹配简单模糊查询(如用户名前缀)支持索引★★★★☆
REGEXP复杂模式匹配(如正则校验)部分支持★★☆☆☆
FULLTEXT全文搜索(如文章内容)全文索引支持★★★★★
精确匹配主键 / 唯一键查询索引全支持★★★★★

总结

本文从基础到高级全面解析了MySQL中字符串匹配的核心方法。实际开发中,需根据数据规模、查询场景和性能要求选择合适的方案:

  • 简单模糊查询优先使用 LIKE + 索引;
  • 复杂模式匹配考虑 REGEXP ,但需注意性能;
  • 大规模文本搜索务必启用 FULLTEXT 索引;
  • 特殊场景(如语音匹配)可结合高级函数实现。

掌握这些技巧,能有效提升数据库查询效率,让字符串匹配不再成为性能瓶颈。

到此这篇关于浅谈MySQL中字符串匹配的N种姿势的文章就介绍到这了,更多相关MySQL 字符串匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中like % %模糊查询的实现

    mysql中like % %模糊查询的实现

    这篇文章主要介绍了mysql中like % %模糊查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅谈mysql中int(1)和int(10)的区别

    浅谈mysql中int(1)和int(10)的区别

    本文主要介绍了浅谈mysql中int(1)和int(10)的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • mysql数据库备份设置延时备份方法(mysql主从配置)

    mysql数据库备份设置延时备份方法(mysql主从配置)

    这篇文章主要介绍了mysql数据库延时备份的方法,也就是mysql主从服务器备份,可以同步到多个服务器,最后我们提供了一个备份脚本,大家参考使用吧
    2013-12-12
  • sql面试题(查看数据中指定几行记录)

    sql面试题(查看数据中指定几行记录)

    一个不错的sql面试题,表 table1,主键为 ID,ID为自动编号(ID可能不连续),要求查询第31-40行记录,如何实现呢?感兴趣的朋友参考下
    2014-05-05
  • 浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    下面小编就为大家带来一篇浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • MySQL 不用存储过程循环插入数据的方法

    MySQL 不用存储过程循环插入数据的方法

    在MySQL中,使用INSERT INTO VALUES语句可以一次性插入多行数据,提高插入效率,还可通过Python的pymysql库生成和执行插入语句,这不仅减少了操作时间,还提高了代码的简洁性和执行效率
    2024-09-09
  • MySQL中的日期时间类型与格式化方式

    MySQL中的日期时间类型与格式化方式

    这篇文章主要介绍了MySQL中的日期时间类型与格式化方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • MySQL权限USAGE和ALL PRIVILEGES的用法

    MySQL权限USAGE和ALL PRIVILEGES的用法

    本文主要介绍了MySQL权限USAGE和ALL PRIVILEGES的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • MySQL的match函数在sp中使用BUG解决分析

    MySQL的match函数在sp中使用BUG解决分析

    这篇文章主要为大家介绍了MySQL的match函数在sp中使用BUG解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • MySQL通用查询日志和慢查询日志全面分析

    MySQL通用查询日志和慢查询日志全面分析

    这篇文章主要介绍了MySQL通用查询日志和慢查询日志的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论