mysql如何查找字段中包含的数字_使用正则regexp匹配查询

秋涛姑娘_5171

秋涛姑娘_5171

2026-03-20

721人浏览

原创

MySQL中查字段含数字应使用'[0-9]'或'[:digit:]',不可用'd';性能差需避免全表扫描,推荐生成列+索引;5.7与8.0正则语法差异大,须按版本适配。

mysql如何查找字段中包含的数字_使用正则regexp匹配查询

MySQL 用 REGEXP 查字段里有没有数字,得写对模式

MySQL 的 REGEXP 不支持 d 这种简写,直接写 '\d' 或 'd' 都会查不到——它只认 POSIX 字符类。想查含数字的记录,得用 [0-9] 或更宽松的 [[:digit:]]。

常见错误是照搬其他语言正则习惯,比如写 WHERE col REGEXP '\d+',结果全空;或者漏掉引号,写成 REGEXP d,直接报语法错。

  • WHERE col REGEXP '[0-9]':最常用,匹配字段中任意位置出现至少一个数字
  • WHERE col REGEXP '^[0-9]+$':整字段全是数字(注意空格会导致失败)
  • WHERE col REGEXP '[[:digit:]]':等价于 [0-9],语义更清晰,但写法稍长

中文、字母混排时,REGEXP 仍能准确定位数字

只要字段值里存在 ASCII 数字字符(0–9),不管前后是汉字、英文字母还是符号,REGEXP '[0-9]' 都能捕获。比如 '订单编号:ORD-2024-001'、'价格¥99.5元'、'测试abc123def' 全部命中。

但要注意:Unicode 数字(如全角数字 123)不会被 [0-9] 匹配,MySQL 原生不支持 Unicode 属性类(如 p{Nd}),这类需求得靠应用层处理或升级到 MySQL 8.0+ 并确认 collation 支持。

  • 全角数字需单独写进模式,例如 '[0-90-9]'(后者是 Unicode 全角 0–9)
  • 字段含换行符时,REGEXP 默认跨行匹配,无需额外标志
  • 大小写不敏感由列的 collation 决定,和 REGEXP 本身无关

REGEXP 查询性能差?这些操作会雪上加霜

MySQL 对 REGEXP 几乎无法使用索引(除非是前缀固定且极短的特殊情况),全表扫描是常态。一旦表超过几万行,响应延迟就很明显。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

容易被忽略的性能雷区:

  • 在 WHERE 中对函数结果用 REGEXP,比如 REGEXP UPPER(col),彻底放弃任何潜在优化可能
  • 用 NOT REGEXP 判定“不含数字”,逻辑上等价但执行计划更差,MySQL 往往放弃优化器提示
  • 在 ORDER BY 或 GROUP BY 里嵌套 REGEXP 表达式,会强制生成临时表 + 文件排序
  • 替代方案优先考虑:加生成列 + 索引,例如 ALTER TABLE t ADD has_digit TINYINT AS (col REGEXP '[0-9]') STORED, ADD INDEX idx_has_digit(has_digit)

MySQL 5.7 和 8.0 的 REGEXP 行为差异不能忽略

MySQL 8.0 重写了正则引擎,支持更多语法(如 +、?、{n} 量词默认启用),而 5.7 默认只支持基本正则(BRE),部分写法行为不一致。

典型差异点:

  • MySQL 5.7 中 'a+b' 的 + 被当字面量,要写成 'a\+b' 才表示“a 后跟 b”;8.0 默认按 ERE 解析,+ 是量词
  • REGEXP '^[0-9]{3,5}$' 在 8.0 可用,在 5.7 会报错,得改写为 '^[0-9][0-9][0-9][0-9]?[0-9]?^'(不推荐)或用应用层过滤
  • 8.0 支持 REGEXP_LIKE() 函数,参数更明确(如可指定匹配模式 'c' 忽略大小写),但 5.7 只有操作符形式

线上环境务必先查 SELECT VERSION(),别假设版本一致。跨版本迁移时,正则表达式得重新验证。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4523

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1189

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6501

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3263

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6460

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8861

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1210

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1052

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 191人学习