
问题现象:
insert all方式插入数据提示如下:ORA-00001: unique constraint (C##CJC.SYS_C008089) violated经检查插入的列并没有重复的值。
问题原因:
中文字段有主键约束,由于插入数据时中文乱码,中文字符全部变成"?",导致相同长度的中文字段被识别为重复数据,最终导致数据无法插入。
解决方案:
正确配置NLS_LANG环境变量。
问题重现过程:
1.创建表t1
SQL> show userUSER is "C##CJC"create table t1(t_name varchar2(300),t_status varchar2(5),primary key(t_name));
2.插入数据
insert allinto 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 0000100001, 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 a30SQL> 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 a30SQL> select * from t1T_NAME T_STA------------------------------ -----????????????????????? 1?????????????????? 1
检查NLS_LANG配置
空,当前没有设置。
[oracle@cjcos02 dbs]$ echo $NLS_LANG[oracle@cjcos02 dbs]$ echo $LANGen_US.UTF-8
查看xshell字符集
文件---属性---终端---编码当前是:Unicode(UTF-8)
检查Oracle数据库服务器字符集(服务器端):
即Oracle以哪种字符编码存储字符
NLS_LANGUAGE为:AMERICANNLS_CHARACTERSET为:AL32UTF8
col PARAMETER for a30col VALUE for a30set pagesize 100select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';PARAMETER VALUE CON_ID------------------------------ ------------------------------ ----------NLS_CHARACTERSET AL32UTF8 1col PARAMETER for a30col VALUE for a30set pagesize 100select PARAMETER,VALUE from nls_database_parameters;PARAMETER VALUE------------------------------ ------------------------------NLS_RDBMS_VERSION 19.0.0.0.0NLS_NCHAR_CONV_EXCP FALSENLS_LENGTH_SEMANTICS BYTENLS_COMP BINARYNLS_DUAL_CURRENCY $NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZRNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZRNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_FORMAT HH.MI.SSXFF AMNLS_SORT BINARYNLS_DATE_LANGUAGE AMERICANNLS_DATE_FORMAT DD-MON-RRNLS_CALENDAR GREGORIANNLS_NUMERIC_CHARACTERS .,NLS_NCHAR_CHARACTERSET AL16UTF16NLS_CHARACTERSET AL32UTF8NLS_ISO_CURRENCY AMERICANLS_CURRENCY $NLS_TERRITORY AMERICANLS_LANGUAGE AMERICAN20 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_LANGAMERICAN_AMERICA.AL32UTF8
再次插入数据
sqlplus c##cjc/******SQL>insert allinto 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 a30SQL> Select * from t1;T_NAME T_STA------------------------------ -----人生七十古稀, 1我年七十为奇。1前十年幼小, 1后十年衰老;1中间只有五十年, 1一半又在夜里过了。1算来只有二十五年在世 1受尽多少奔波烦恼。 18 rows selected.SQL> commit;Commit complete.
插入成功
#####chenjuchao 20211016 14:35#####

文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




