zoukankan      html  css  js  c++  java
  • ORACLE--ORA-12899: value too large for column-----字符集问题+byte、char长度单位问题

    问题描述:前两天项目在客户那儿测试时,出现一个问题:ORA-12899: value too large for column。

    解决思路:

    一、首先想到的是,看源和目标字符集的字符集是否相同,因为吃太多字符集的亏了

    select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
    

     一般情况下,数据库的NLS_CHARACTERSET 为AL32UTF8或UTF8,即一个汉字占用三到四个字节。如果NLS_CHARACTERSET为ZHS16GBK,则一个字符占用两个字节。

     具体数据类型:varchar2类型:对于VARCHAR2字符要用几个字节存储,要看数据库使用的字符集,比如GBK,汉字就会占两个字节,英文1个。如果是UTF-8,汉字一般占3个字节,英文还是1个。 所以,varchar2长度的定义,最多可达4000(可存储4000个英文字符),但实际能储存的长度,取决于字符集。

            nvarchar2类型:对于NVARCHAR2字符,所有字符都会按照2个字节进行存储,因此最多只能定义到2000的长度。同时,对于纯英文的存储,那么就会多耗费一倍空间(因为英文在varchar2类型里只要1个字节的空间)。但对于汉字的存储其实是更合适的,这样能保证汉字存储得最多(2000个)。

       具体汉字占用多少个字节或字符,可执行下面的sql验证:

    select length('我') 字符数 from dual;
    select lengthb('我') 字节数 from dual;
    

        这个问题一般是需要修改字符集的,参考:http://blog.itpub.net/8475224/viewspace-692675/

     二、长度单位问题 byte或char

      NLS_LENGTH_SEMANTICS参数决定oracle存储时长度的单位是char或byte。通过下面sql查看:

    select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
    

      后来经过对比发现,正是这个问题造成的错误!

           如何解决呢?我们这儿的方案是在建表时指定长度单位是char,已经建好的表是无法解决的。  

           如何修改这个参数,参考:http://blog.csdn.net/shuiqingtinglin/article/details/7095787

      

    我要把所有的坑都趟平!
  • 相关阅读:
    总结
    webview细节注意
    对图片的处理
    介绍并提高app中WebView的性能
    工作中新接触的问题
    iOS环信
    Framework静态库制作方法
    多线程GCD
    iOS开发之地图与定位
    ARC内存管理机制详解
  • 原文地址:https://www.cnblogs.com/loveling-0239/p/7488449.html
Copyright © 2011-2022 走看看