MySQL中判断字符串含数字应使用REGEXP '[0-9]',因不支持d;MySQL 5.7-需避免Unicode问题;PostgreSQL用~ '\d';SQLite需扩展;注意空值、索引失效及匹配逻辑。

MySQL中用REGEXP判断字符串含数字的写法
MySQL 8.0+ 原生支持 REGEXP(等价于 RLIKE),判断字段是否含数字,最直接的是匹配任意一个数字字符:
SELECT * FROM users WHERE name REGEXP '[0-9]';注意:MySQL 的正则引擎不支持
d 简写,必须写成 [0-9] 或 [[:digit:]]。后者更符合 POSIX 标准,兼容性略好,但实际效果一致。
MySQL 5.7 及更早版本的兼容写法
老版本 MySQL 的 REGEXP 对 Unicode 支持弱,且不支持 Unicode 属性类(如 p{Nd})。如果字段含中文、emoji 或其他多字节字符,仅靠 [0-9] 是安全的——它只匹配 ASCII 数字 0–9,不会误判全角数字(如‘1’)或带圈数字(如‘①’)。若业务明确要求识别全角数字,需在应用层处理,数据库层不建议强行用正则覆盖。
PostgreSQL 和 SQLite 怎么写
PostgreSQL 使用 ~ 操作符,支持 d:
SELECT * FROM users WHERE name ~ 'd';SQLite 默认不支持正则,需加载扩展或改用
LIKE 组合(如 name LIKE '%0%' OR name LIKE '%1%' ...),但效率低、不推荐。真要正则匹配,优先考虑升级到支持 REGEXP 的 SQLite 扩展版本,或把过滤逻辑移到应用代码里。
容易被忽略的边界情况
这些情况常导致误判或漏判:
-
REGEXP '[0-9]'匹配的是“至少一个数字”,不是“全是数字”——想验证纯数字字段请用^[0-9]+$ - 空字符串、NULL 值不会命中
REGEXP,但需确认业务是否要单独处理 NULL(比如加OR name IS NULL) - 索引对
REGEXP无效,大数据量时慎用在 WHERE 条件里,尤其没其他可下推的过滤条件时 - 区分大小写取决于列的 collation;若需强制不区分大小写,可用
COLLATE utf8mb4_0900_as_cs显式指定,但数字本身无大小写问题,这点对数字判断影响不大

















