问题现象:
insert all方式插入数据提示如下:
ORA-00001: unique constraint (C##CJC.SYS_C008089) violated
经检查插入的列并没有重复的值。
复制
问题原因:
中文字段有主键约束,由于插入数据时中文乱码,中文字符全部变成"?",导致相同长度的中文字段被识别为重复数据,最终导致数据无法插入。
复制
解决方案:
正确配置NLS_LANG环境变量。
复制
问题重现过程:
1.创建表t1
SQL> show user
USER is "C##CJC"
create table t1(t_name varchar2(300),t_status varchar2(5),primary key(t_name));
复制
2.插入数据
insert all
into t1 values('人生七十古稀,','1')
into t1 values('我年七十为奇。','1')
into t1 values('前十年幼小,','1')
into t1 values('后十年衰老;','1')
into t1 values('中间只有五十年,','1')
into t1 values('一半又在夜里过了。','1')
into t1 values('算来只有二十五年在世','1')
into t1 values('受尽多少奔波烦恼。','1')
select 1 from dual;
复制
报错如下:
ERROR at line 1:
ORA-00001: unique constraint (C##CJC.SYS_C008089) violated
复制
报错信息:
[oracle@cjcos02 ~]$ oerr ora 00001
00001, 00000, "unique constraint (%s.%s) violated"
// *Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
// For Trusted Oracle configured in DBMS MAC mode, you may see
// this message if a duplicate entry exists at a different level.
// *Action: Either remove the unique restriction or do not insert the key.
复制
为什么插入的t_name没有重复字,但是报错ORA-00001呢?
没有插入成功
SQL> col t1_name for a30
SQL> select * from t1;
no rows selected
复制
尝试逐条插入
第一条可以正常插入
SQL> insert into t1 values('人生七十古稀,','1');
1 row created.
复制
第二条插入报错ORA-00001
SQL> insert into t1 values('我年七十为奇。','1');
insert into t1 values('我年七十为奇。','1')
*
ERROR at line 1:
ORA-00001: unique constraint (C##CJC.SYS_C008089) violated
复制
第三条可以正常插入
SQL> insert into t1 values('前十年幼小,','1');
1 row created.
复制
第四条插入报错ORA-00001
SQL> insert into t1 values('后十年衰老;','1');
insert into t1 values('后十年衰老;','1')
*
ERROR at line 1:
ORA-00001: unique constraint (C##CJC.SYS_C008089) violated
复制
查看插入结果
SQL> col t_name for a30
SQL> select * from t1
T_NAME T_STA
------------------------------ -----
????????????????????? 1
?????????????????? 1
复制
检查NLS_LANG配置
空,当前没有设置。
[oracle@cjcos02 dbs]$ echo $NLS_LANG
[oracle@cjcos02 dbs]$ echo $LANG
en_US.UTF-8
复制
查看xshell字符集
文件---属性---终端---编码
当前是:Unicode(UTF-8)
复制
检查Oracle数据库服务器字符集(服务器端):
即Oracle以哪种字符编码存储字符
NLS_LANGUAGE为:AMERICAN
NLS_CHARACTERSET为:AL32UTF8
复制
col PARAMETER for a30
col VALUE for a30
set pagesize 100
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
PARAMETER VALUE CON_ID
------------------------------ ------------------------------ ----------
NLS_CHARACTERSET AL32UTF8 1
col PARAMETER for a30
col VALUE for a30
set pagesize 100
select PARAMETER,VALUE from nls_database_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_RDBMS_VERSION 19.0.0.0.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTERS .,
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN
20 rows selected.
复制
检查客户端操作系统字符集:
即客户端操作系统以哪种字符编码存储字符。
:为AMERICAN_AMERICA.AL32UTF8
userenv函数返回当前会话(session)的相关信息。
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
复制
返回格式language_territory.characterset
配置NLS_LANG
格式:
NLS_LANG=<Language>_<Territory>.<Clients Characterset>
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
复制
配置:
[oracle@cjcos02 dbs]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
[oracle@cjcos02 dbs]$ echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8
复制
再次插入数据
sqlplus c##cjc/******
SQL>
insert all
into t1 values('人生七十古稀,','1')
into t1 values('我年七十为奇。','1')
into t1 values('前十年幼小,','1')
into t1 values('后十年衰老;','1')
into t1 values('中间只有五十年,','1')
into t1 values('一半又在夜里过了。','1')
into t1 values('算来只有二十五年在世','1')
into t1 values('受尽多少奔波烦恼。','1')
select 1 from dual;
8 rows created.
复制
SQL> col t_name for a30
SQL> Select * from t1;
T_NAME T_STA
------------------------------ -----
人生七十古稀, 1
我年七十为奇。1
前十年幼小, 1
后十年衰老;1
中间只有五十年, 1
一半又在夜里过了。1
算来只有二十五年在世 1
受尽多少奔波烦恼。 1
8 rows selected.
SQL> commit;
Commit complete.
复制
插入成功
#####chenjuchao 20211016 14:35#####
文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
第一反应是本次要插入的,包含重复😁按理说乱码不会一样啊,比如?多几个少几个,正好字数一样赶上了?
3年前

评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
786次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
664次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
591次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
548次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
532次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
510次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
496次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
470次阅读
2025-04-17 09:30:30
OR+DBLINK的关联SQL优化思路
布衣
382次阅读
2025-05-05 19:28:36
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
382次阅读
2025-04-15 14:48:05