脏数据排查需分类型处理: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' 并静默吞掉错误。
可以实现用户的在线注册、登陆后可以添加图书、购买图书,可以对图书类别、出版社、价格等进行饼图分析默认帐号/密码:51aspx/51aspx该系统采用三层接口开发,App_Code下为三层结构的代码文件,适合三层入门者学习使用数据绑定控件使用的是GridView,顶部公用文件采用了UserControl用户控件调用DB_51aspx下为Sql数据库文件,附件即可【该源码由51aspx提供】
- 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'会被当成不同值漏检
170(虚拟运营商号段)或 000(明显伪造),这种得结合业务规则再筛。自动化脚本容易忽略大小写、全半角、不可见字符(如 U+200B 零宽空格),人工抽检仍不可替代。









