Oracle 主键冲突报错踩坑-- "ORA-00001: 违反唯一约束条件 "
根本原因
因为特殊字符存在导致的主键冲突报错
细节分析
前提
oracle中存在一张table,table中存在字段 CName(nvarchar),且该字段为唯一主键;
具体
- 现有一条数据需要入库,内容如下 '中信建投惠享债券型证券投资基金' (包含零宽空格符)直接根据这个字段值查询数据库 值是不存在的
select * from tablename where CName='中信建投惠享债券型证券投资基金'
-
查询数据库发现实际值为 '中信建投惠享债券型证券投资基金' (不包含零宽空格符) 程序判断数据不存在,但是入库时报错主键冲突
-
1 2中内容肉眼看着是相同的,实际上1的内容中包含 Unicode零宽空格字符 该字符常用编辑器查看,是不可见,但可通过编码来辨别 如下图
当然直接通过程序判断也是可以的
4.删除数据库中无特殊符号的数据,重新入库,入库正常
5.但是这里还要一个坑,虽然包含特殊符号的数据正常入库 但是使用包含特殊字符的内容直接查 数据是空的,使用无特殊字符的内容查询 就可以了
select * from tablename where CName='中信建投惠享债券型证券投资基金' (包含零宽空格符)
select * from tablename where CName='中信建投惠享债券型证券投资基金' (不包含零宽空格符)
正则去除特殊字符
可以使用以下正则去除特殊字符:[^\w\d\u4E00-\u9FFF]+ (匹配除字母、数字、汉字以外的字符)
Regex.Replace(input, "[^\w\d\u4E00-\u9FFF]+", "")
- \w 匹配字母和数字
- \d 匹配数字
- \u4E00-\u9FFF 匹配汉字