Oracle 主键冲突报错踩坑-- "ORA-00001: 违反唯一约束条件 "

根本原因

因为特殊字符存在导致的主键冲突报错

细节分析

前提

oracle中存在一张table,table中存在字段 CName(nvarchar),且该字段为唯一主键;

具体
  1. 现有一条数据需要入库,内容如下 '中信建投惠享债券型证券投资基金​' (包含零宽空格符)直接根据这个字段值查询数据库 值是不存在的
 select *  from tablename where CName='中信建投惠享债券型证券投资基金​'
  1. 查询数据库发现实际值为 '中信建投惠享债券型证券投资基金' (不包含零宽空格符) 程序判断数据不存在,但是入库时报错主键冲突

  2. 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 匹配汉字
posted @ 2023-07-18 15:11  C余L小R鱼  阅读(1326)  评论(0编辑  收藏  举报