zoukankan      html  css  js  c++  java
  • ORA12899错误解决记录

    做极限测试时 应用程序打印出ORA-12899: 列 "xxx"."表"."字段" 的值太大 (实际值: 21, 最大值: 20)的错误

    原来数据库使用的是UTF8字符集,难怪一个汉字占用3个字节。这样一来原先按一个汉字占两个字节设计的数据库,应用的时候很多字段都会因长度不够,出现ORA-12899错误。

    可以将字符集改为 ZHS16GBK即可解决。

    转解决方案

    解决方案: 
    修改oracle 10g的字符集
    修改数据库字符集为:ZHS16GBK
    查看服务器端字符集SQL > select * from V$NLS_PARAMETERS
    修改:$sqlplus /nolog  www.2cto.com  
    SQL>conn / as sysdba
    若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,
    然后执行以下命令:
    SQL>shutdown immediate
    SQL>STARTUP MOUNT
    SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION
    SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0
    SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0
    SQL>ALTER DATABASE OPEN
    SQL>ALTER DATABASE CHARACTER SET ZHS16GBK
    ERROR at line 1:ORA-12721: operation cannot execute when other sessions are active
    若出现上面的错误,使用下面的办法进行修改,使用INTERNAL_USE可以跳过超集的检查:
    SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK
    SQL>SHUTDOWN IMMEDIATE
    SQL>STARTUP
     
    引申阅读:http://blog.sina.com.cn/s/blog_6a7447840100mjcc.html

    不能把数据库的字符集改成ZHS16GBK。因为系统要求不仅能支持中文,还要能支持其他亚洲字符。这样CHARACTER SET就只能设这成UTF8或AL32UTF8,这两种字符集每个汉字占用的字节数分别是3和4,都不是2。
    更改所有CHAR/VARCHAR字段的长度也不现实。整套系统是从其他公司买的产品,内含上千张表,逐个去修改字段不太可能。


    查看参数NLS_LENGTH_SEMANTICS。
    Oracl文档中的说明:
    Syntax: NLS_LENGTH_SEMANTICS = string
    Range of values: BYTE | CHAR
    NLS_LENGTH_SEMANTICS enables you to create CHAR and VARCHAR2 columns using either byte or character length semantics. Existing columns are not affected.
    NCHAR, NVARCHAR2, CLOB, and NCLOB columns are always character-based. You may be required to use byte semantics in order to maintain compatibility with existing applications.
    NLS_LENGTH_SEMANTICS does not apply to tables in SYS and SYSTEM. The data dictionary always uses byte semantics.


    查看数据库中该参数的设置。
    SQL> select * from nls_database_parameters where parameter like 'NLS%SEMANTICS';
    PARAMETER                 VALUE
    ------------------------- --------------------
    NLS_LENGTH_SEMANTICS       BYTE

    SQL> show parameter nls_length
    NAME                                 TYPE       VALUE
    ------------------------------------ ---------- -------
    nls_length_semantics                 string     BYTE


    把该参数改成CHAR
    SQL>alter system set NLS_LENGTH_SEMANTICS=BYTE scope=BOTH;

    修改后查看参数。
    SQL> show parameter nls_length
    NAME TYPE VALUE
    ------------------------------------ ---------- -------
    nls_length_semantics string CHAR

    从新执行insert操作。
    SQL> insert into t1 values('一二三');
    insert into t1 values('一二三')
    *
    ERROR at line 1:
    ORA-12899: value too large for column T1.COL1 (actual: 9, maximum:8)
    还是出错!

    新创建一张表,再测试。
    SQL> create table t2 (col1 varchar2(8));
    表已创建。

    SQL> insert into t2 values('一二三')
    已创建 1 行。

    SQL> select * from t2;
    COL1
    ----------------
    一二三

    OK了

    再查看t1和t2的表结构,可以发现一些差别。
    SQL> desc t1
    名称                  是否为空? 类型
    -------------------- -------- -------------------------
    COL1                           VARCHAR2(8)

    SQL> desc t2
    名称                  是否为空? 类型
    -------------------- -------- -------------------------
    COL1                           VARCHAR2(8 CHAR)


    参数NLS_LENGTH_SEMANTICS改成CHAR以后,t2.col1列可以存储8个汉字,英文字符也只能存储8个。
    SQL> insert into t2 values('一二三四五六七八');
    已创建 1 行。

    SQL> insert into t2 values('abcdefgh');
    已创建 1 行。

    SQL> insert into t2 values('abcdefghi');
    insert into t2 values('abcdefghi')
    *
    ERROR 位于第 1 行:
    ORA-12899: value too large for column T2.COL1 (actual: 9, maximum:8)

  • 相关阅读:
    L1-061 新胖子公式 (10 分)
    L1-060 心理阴影面积 (5 分)
    L1-059 敲笨钟 (20 分)
    Linux高性能服务器编程—进程池和线程池
    epoll系列系统调用
    18.5.2 多线程并发服务器端的实现
    10.4 基于多任务的并发服务器
    侯捷C++(complex类)
    Qt 事件机制
    C++篇49问49答
  • 原文地址:https://www.cnblogs.com/chncongblog/p/2992402.html
Copyright © 2011-2022 走看看