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

  

 

转载于:https://www.cnblogs.com/loveling-0239/p/7488449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值