暂无图片
暂无图片
6
暂无图片
暂无图片
1
暂无图片

Oracle 记一次ORA-00001问题处理

IT小Chen 2021-10-17
4567

问题现象:

    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年前
                                              评论
                                              暂无图片 0
                                              第一反应是本次要插入的,包含重复😁按理说乱码不会一样啊,比如?多几个少几个,正好字数一样赶上了?
                                              3年前
                                              暂无图片 点赞
                                              评论