You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中校验姓名列的正则问题:允许空格、连字符等,排除其他特殊字符

解决SQL姓名列特殊字符校验问题

你的正则表达式失效的核心原因是连字符-在字符集里的位置错误,导致它被正则引擎误解析为字符范围符号,而非普通字符。另外部分SQL数据库对\s的支持存在差异,需要调整为POSIX标准的空白匹配语法。

修正后的正则表达式及分库写法

根据你使用的SQL数据库,选择对应的写法:

MySQL/MariaDB

MySQL采用POSIX正则语法,需用[:space:]代替\s,同时将-放在字符集末尾确保被识别为普通字符:

-- 筛选出含违规字符的姓名
SELECT name
FROM your_table
WHERE name REGEXP '[^a-zA-Z0-9[:space:].`-]';

-- 筛选出符合规则的姓名(取反)
SELECT name
FROM your_table
WHERE NOT name REGEXP '[^a-zA-Z0-9[:space:].`-]';

PostgreSQL

PostgreSQL支持\s,同样需保证-在字符集首尾位置:

-- 筛选含违规字符的姓名
SELECT name
FROM your_table
WHERE name ~ '[^a-zA-Z0-9\s.`-]';

-- 筛选符合规则的姓名(取反)
SELECT name
FROM your_table
WHERE name !~ '[^a-zA-Z0-9\s.`-]';

关键说明

  1. 连字符位置:将-放在字符集的最后(或最开头),避免被解析为x-y这样的字符范围(比如原正则中`到-是无效ASCII范围,会导致正则行为异常)。
  2. 空白字符匹配:MySQL的REGEXP不支持\s,必须用POSIX标准的[:space:]来匹配空格、制表符等空白字符;PostgreSQL则两种写法都支持。
  3. 正则逻辑:[^...]是反向匹配,表示匹配不在指定集合内的字符,只要姓名中存在这类字符,就判定为无效。

验证案例

  • 有效姓名(不会被匹配):Brad、Brad-Tom、Brad Cooper、Brade`、Brad.Cooper
  • 无效姓名(会被匹配):Br@ad、Brad#

内容的提问来源于stack exchange,提问作者Sty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:00:24