大家好,
目前我们在处理用户姓名数据时遇到了一些棘手的问题,这些数据来自不同来源的单点登录(SSO)系统,导入到数据库后出现了多种格式不一致的情况,具体问题如下:
- 数据类型混杂:同一个字段中同时存在中文姓名和英文姓名;
- 非本地姓名格式混乱:非本地姓名的格式极不统一,比如拉丁字母姓名(如 "Taspian Mahir Md AHNAF")、日语姓名的罗马音拼写(如 "Tanaka Yuki",而不是统一的 "Yuki Tanaka" 或 "Tanaka, Yuki"),甚至存在多种文字/命名规则混合的情况;
- 字段映射错误:班级信息、学号、学年等非姓名数据混入了姓名字段;
- 姓名顺序不一致:部分记录采用 "姓, 名" 格式,部分采用 "名 姓" 格式,还有的在单个字段中重复包含首选名;
- 包含非用户数据:条目里混入了头衔(如 "Mr./Ms/Mrs" 等);
- 特殊字符问题:存在括号、引号及其他格式符号;
- 编码问题:部分字符显示为乱码(例如 "é™³å®¶æ‚ ???");
我们的数据库中有一张用户表,核心涉及两个字段:firstname(名)和 lastname(姓),表结构大致如下(仅展示相关字段):
CREATE TABLE `user` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`firstname` varchar(100) NOT NULL DEFAULT '',
`lastname` varchar(100) NOT NULL DEFAULT '',
-- 其他非相关字段省略
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
我们的最终目标是基于清洗后的 firstname、lastname 以及从中识别出的 “首选名”,生成一个 fullname 字段,组合规则如下:
基础规则:若没有首选名,fullname 为 firstname+lastname 或 lastname+firstname(具体顺序需根据姓名类型统一规范,例如中文可能采用 “姓 + 名”,英文可能采用 “名 + 姓” 等);
含首选名规则:若用户有首选名(且已从 firstname 或 lastname 中识别分离出来),则 fullname 为 firstname+lastname+首选名 或 lastname+firstname+首选名(同样需遵循统一的顺序规范)。
现在需要寻求一种持久化、可持续且自动化的数据库层面解决方案,来解决上述姓名数据的标准化问题。具体来说,希望实现:
- 能够自动识别并清洗异常格式(如去除头衔、特殊字符、冗余信息);
- 统一非本地姓名的拼写规则和顺序;
- 修复编码错误导致的乱码;
- 确保
firstname和lastname字段仅包含正确的名和姓信息,避免其他数据混入; - 方案能够适应持续新增的数据(即不是一次性处理,而是能自动应用于新导入的数据)。
请问各位有什么成熟的思路或技术方案吗?比如通过数据库触发器、存储过程,结合正则表达式或特定的姓名解析逻辑,或者引入外部工具与数据库联动?欢迎分享经验和具体实现思路,非常感谢!