mysql如何判断一个字符串是否为数字_REGEXP正则匹配校验

冬强姑娘_4883

冬强姑娘_4883

2026-05-05

272人浏览

原创

mysql不提供isnumeric()函数,替代方案仅正则匹配和类型转换兜底;推荐用^-?[0-9]+(.[0-9]+)?$校验整数、负数、小数,需注意空字符串、前导零、数值溢出等语义问题。

mysql如何判断一个字符串是否为数字_regexp正则匹配校验

MySQL 中没有 ISNUMERIC() 函数

很多刚从 SQL Server 或 PostgreSQL 转过来的人会直接写 ISNUMERIC('123'),结果报错:Unknown function 'ISNUMERIC'。MySQL 从 8.0 到最新版(截至 2026 年)都**不提供 ISNUMERIC() 内置函数**。别试了,它不存在。

替代方案只有三种:正则匹配、类型转换试探、或用 CAST()/CONVERT() 配合错误处理逻辑(但 MySQL 不支持 TRY_CAST)。所以实际能稳定用的,就只剩 REGEXP 和类型转换兜底这两种路。

用 ^[0-9]+$ 匹配纯整数(不含负号、小数点、空格)

这是最常见也最容易踩坑的写法。比如判断字段 str_col 是否只含数字:

SELECT str_col, str_col REGEXP '^[0-9]+$' AS is_digit FROM t;

注意这组边界符 ^ 和 $ 缺一不可——否则 'abc123def' 也会返回 1(因为中间有连续数字)。

  • '123' → 1(正确)
  • '12.3' → 0(小数点不被接受)
  • '-5' → 0(负号不被接受)
  • ' 123 ' → 0(前后空格导致开头/结尾不匹配)
  • '123a' → 0(含字母,正确拒绝)

如果业务允许前导/尾随空格,得先套一层 TRIM(str_col);如果要支持负数,得改成 '^-?[0-9]+$';如果还要支持小数,就得更复杂——见下一条。

支持整数、负数、小数的正则:^-?[0-9]+.?[0-9]*$

这个模式看起来合理,但有陷阱:它会把 '123.'(末尾带点)、'.'、'-.' 都判为合法。真正安全的浮点数校验需要排除这些边界情况。

推荐用这个更严谨的写法:

MySQL
MySQL

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

下载
str_col REGEXP '^-?[0-9]+(\.[0-9]+)?$'

说明:

  • ^-?:可选负号
  • [0-9]+:至少一位数字(强制整数部分存在)
  • (\.[0-9]+)?:小数部分是「点 + 至少一位数字」的整体,且整体可选

这样 '123.45'、'-7'、'0.0' 都过,而 '123.'、'.'、'abc' 全部失败。

注意:MySQL 中反斜杠要写成双反斜杠 \.,否则会被当作文本点(即任意字符)解析。

为什么不用 [^0-9.] 这种“找非数字”思路?

有人看到 '123a' REGEXP '[^0-9.]' 返回 1 就以为“有非数字就不是数字”,然后反向用 NOT 包一层,写成:

NOT (str_col REGEXP '[^0-9.]')

这看似简洁,但问题很大:

  • 空字符串 '' 会通过(因为没匹配到任何非数字字符)
  • '.' 也会通过(它里面没有「非数字且非点」的字符)
  • '..'、'-.' 同样漏判
  • 没处理空格、制表符、Unicode 空格等隐形字符

本质是这种写法在做「排除法」,但排除条件太弱,无法保证「全是有效数字字符」。正向定义模式(如 ^-?[0-9]+(\.[0-9]+)?$)才可控。

真正容易被忽略的点是:正则只管字符形状,不管语义合法性。比如 '0123' 是合法整数,但若业务要求「不能有前导零」,就得额外加逻辑;再比如超长数字(如 50 位)可能能过正则,但转成 DECIMAL 时溢出——正则不负责数值范围校验。

相关文章

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

4363

8

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

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

2023.10.27

911

4

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

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

2024.02.23

1129

5

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

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

2024.03.06

6281

10

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

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

2024.03.06

3103

4

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

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

2024.04.07

6260

11

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

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

2024.04.29

8501

6

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

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

2024.04.29

1150

5

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

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

2024.04.29

1012

5

热门下载

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

精品课程

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

共1课时 | 188人学习