跳转到主内容
极星编程网:以代码为星,赴技术山海!

SQL 如何发现脏数据?

脏数据排查需分类型处理:NULL与空字符串混用须用IS NULL或TRIM()识别;数值型字段用正则或SAFE_CAST过滤非法值;时间字段检查非法日期格式;通过GROUP BY+HAVING发现异常分布。 查 NULL 和空字符串混用的字段 很多脏数据源于业务逻辑没约束好,
NULL
和
''
(空字符串)被当成同义词乱用。比如用户姓名字段本该非空,结果既有
NULL
,又有
''
,甚至还有只含空格的值。 用
WHERE name IS NULL OR TRIM(name) = ''
快速定位这类混合状态
TRIM()
很关键——不清理空格就漏掉
' '
这类隐形脏数据 注意:MySQL 的
'' = NULL
永远为 false,不能用
= NULL
判断,必须用
IS NULL
识别数值型字段里的非数字内容 当一个定义为
INT
或
DECIMAL
的列实际存了
'N/A'
、
'--'
、
'未知'
,数据库可能隐式转成 0 或报错,但数据语义已丢失。 PostgreSQL 可用
NOT num_col ~ '^[0-9]+\.?[0-9]*$'
正则过滤非法值(注意小数点和负号需扩展) MySQL 8.0+ 支持
REGEXP
,老版本只能靠
CAST(num_col AS SIGNED)
配合
num_col != CAST(num_col AS SIGNED)
粗筛(有精度损失) 更稳的做法是建视图或临时表,用
TRY_CAST
(SQL Server)或
SAFE_CAST
(BigQuery)兜底,避免查询直接失败 找时间字段中的非法日期
DATE
或
DATETIME
字段里塞进
'2023-02-30'
、
'0000-00-00'
、
'9999-99-99'
是典型脏数据,MySQL 在严格模式下会拒绝,但兼容模式下可能存成
'0000-00-00'
并静默吞掉错误。 go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 MySQL 查非法日期:
WHERE date_col '9999-12-31' OR date_col = '0000-00-00'
PostgreSQL 更严格,但仍有
'infinity'
或
'-infinity'
可能混入,需单独排除 别依赖
IS DATE
这类函数——标准 SQL 没这个语法,各库实现不一,容易误判 用 GROUP BY + HAVING 暴露重复/异常分布 有些脏数据不靠单条记录能看出,得看整体分布。比如「用户等级」字段理论上只有 1~5,结果
GROUP BY level HAVING COUNT(*) > 0
却扫出 level = 999 或 -1。 先跑
SELECT level, COUNT(*) FROM users GROUP BY level ORDER BY COUNT(*)
,一眼看出离群值 配合
HAVING COUNT(*) 找低频异常值(如拼写错误的枚举项 'gold'
和
'Gold'
算两个) 字符串字段记得加
LOWER()
或
COLLATE utf8mb4_0900_as_cs
控制大小写敏感性,否则
'VIP'
和
'vip'
会被当成不同值漏检 真实生产环境里,脏数据往往藏在「看起来合法」的边界上:比如手机号字段全是 11 位数字,但开头是
170
(虚拟运营商号段)或
000
(明显伪造),这种得结合业务规则再筛。自动化脚本容易忽略大小写、全半角、不可见字符(如
U+200B
零宽空格),人工抽检仍不可替代。

相关文章