mysql用regexp'^[0-9]+$'、postgresql用~'^[0-9]+$'、sql server用not like'%1%'且需排除空字符串和null,三者语法不同,无跨库通用方案。0-9 ↩

MySQL 中用 REGEXP 判断纯数字字段
MySQL 不支持标准 SQL 的 ISNUMERIC(),但可用正则快速筛出全为数字的值。注意:空字符串、负号、小数点、开头空格都会导致匹配失败。
假设表 users 有字段 phone,想查只含 0–9 的记录:
SELECT * FROM users WHERE phone REGEXP '^[0-9]+$';
说明:
-
^和$是关键,确保从头到尾都匹配,否则'abc123'这类也会被误中 -
[0-9]+表示至少一个数字;若允许空字符串,得用*,但通常不建议——空值应单独用IS NULL或=''判断 - 该写法对
NULL值自动返回FALSE,所以不会漏掉或错选空数据
PostgreSQL 中用 ~ 操作符配合正则
PostgreSQL 不认 REGEXP,改用波浪线操作符 ~,语义相同但语法更紧凑。
同样查 phone 字段纯数字记录:
SELECT * FROM users WHERE phone ~ '^[0-9]+$';
注意点:
- 大小写敏感,
~*才忽略大小写,但数字场景下无影响 - 如果字段是
TEXT类型,没问题;若是CHAR(n),可能带尾部空格,需先TRIM(phone)再匹配 - 性能上,没索引时全表扫描不可避免;若高频查询,可建函数索引:
CREATE INDEX idx_phone_digits ON users ((phone ~ '^[0-9]+$'));
SQL Server 中用 NOT LIKE 组合排除非数字字符
SQL Server 没原生正则(2016+ 可用 STRING_SPLIT 配合 CLR,但太重),最稳的方式是反向排除:只要字段里找不到任何非数字字符,就认为是纯数字。
写法如下:
SELECT * FROM users WHERE phone NOT LIKE '%[^0-9]%' AND phone != '';
解释:
-
[^0-9]表示“非数字字符”,NOT LIKE '%[^0-9]%'即“不包含任意一个非数字字符” - 必须加
AND phone != '',否则空字符串也会通过该条件(因为里面确实没有非数字字符) - 该方式不处理
NULL,需额外加AND phone IS NOT NULL - 比
ISNUMERIC()更可靠——后者会把'1e4'、'.'、'+'也判为数字
跨数据库兼容写法?别硬凑,按需选方案
没有一行 SQL 能在 MySQL、PostgreSQL、SQL Server、Oracle 上都正确跑通纯数字判断。强行用 CAST 或 TRY_CAST 会引入新问题:比如把 '0123' 转成整数后变 123,丢失前导零,且无法区分 '123 '(带空格)和 '123'。
真正要落地,得看三点:
- 你用的是哪个数据库?先确认版本(如 SQL Server 2017+ 才有
TRY_CAST) - 字段是否允许前导零?如果业务要求保留
'00123',正则匹配是唯一稳妥方式 - 有没有性能压力?高并发查千万级表时,正则几乎必然慢于加了计算列+索引的方案
边界情况永远比想象中多:全零('0000')、超长数字(超出 BIGINT 范围)、Unicode 全角数字(如 QWERTY 键盘下的0123)。别指望一个表达式包打天下。











