当前位置:  数据库>oracle

ORA-12899: value too large for column

    来源: 互联网  发布时间:2017-05-17

    本文导语: 昨天,同事导数据,本来一直好用的文件,就一直在报错:ORA-12899: value too large for column,本来以为程序修改导致字段长度变了,就改了一张表的结构。结果可好,导下一张表依然报错。。报错也好,也就确定了不是程序问题,...

昨天,同事导数据,本来一直好用的文件,就一直在报错:ORA-12899: value too large for column,本来以为程序修改导致字段长度变了,就改了一张表的结构。结果可好,导下一张表依然报错。。报错也好,也就确定了不是程序问题,是DB做的有问题。后来靠着强大的google找到了答案,才觉得Oracle error code也很强大!
 
通常会查询NLS_CHARACTERSET(数据库字符集),NLS_NCHAR_CHARACTERSET(国家字符集),应该要存储多种语言,需要字符集为UTF-8。
 
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
 
结果UTF-8,OK。
 
查看没问题的DB里 FieldA varchar2(10 char)
 
查看有问题的DB里 FieldA varchar2(10)
 
(没出现问题之前还真没注意到这两种定义是有区别的。。。)
 
UTF-8里一个中文字符是3 bytes,从上面的定义可以看出来,如果char/byte 定义导致的可存储数据长度相差很大了。
 
设置参数NLS_LENGTH_SEMANTICS可以在create table时对CHAR 或者VARCHAR2列指定使用字节(byte)或者字符(character)来定义长度。
 
NCHAR, NVARCHAR2, CLOB, and NCLOB 列都是基于字符(character)的。
 
NLS_LENGTH_SEMANTICS不会影响到SYS和SYSTEM用户表,数据字典定义都使用字节(byte)。
 
可以在定义列时候显示指定使用字节(byte)或者字符(character)来定义长度:
 
CHAR(10 BYTE)  - 无论NLS_LENGTH_SEMANTICS设置成什么,都使用字节(byte)。
 
CHAR(10 CHAR) - 无论NLS_LENGTH_SEMANTICS设置成什么,都使用字符(char)。
 
 
 
select * from v$nls_parameters where parameter = 'NLS_LENGTH_SEMANTICS';
 
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_LENGTH_SEMANTICS
BYTE
 
ALTER SYSTEM SETNLS_LENGTH_SEMANTICS=CHAR scope=BOTH;
修改完毕重启DB,show parameter NLS_LENGTH_SEMANTICS 依然是BYTE。
 
Update  props$ set VALUE$=‘CHAT’ Where name=‘NLS_LENGTH_SEMANTICS’;
 
--好吧,不知道直接update有没影响,不是product DB才可以这么嚣张的操作的。。貌似很多人不让这样改字符集,其实改完参数就应该继续往下测试,避免用这样极端的修改方式。
 
NLS_LENGTH_SEMANTICS值更改为了CHAR
 
select * from v$nls_parameters where parameter = 'NLS_LENGTH_SEMANTICS';
 
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_LENGTH_SEMANTICS
CHAR
 
再导数据依然报错。。。
 
重建刚才的表,就发现之前定义varchar2(10) 变成了varchar2(10 char),也就是说修改生效了。但是为什么还是不能正常导数据呢?
 
后来发现,NLS_LENGTH_SEMANTICS 还有一句说明:现有列不受修改影响!!
 
也就是说想要通过这种方法解决问题貌似行不通了,因为不想把那几万张用户表都alter一遍。
 
在Create DB时候确实需要非常细致,避免类似这种错误,create之后早期也要做好必要的check避免之后发生类似问题。之前还犯过把DB字符集搞错了,结果这些参数改来改去最后还是不得不重建DB。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ORA-00947:Not enough values (没有足够的值)的深入分析
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法 iis7站长之家
  • Eclipse连接Oracle数据库的ORA-00604 ORA-12705错误
  • oracle ORA-01114、ORA-27067错误解决方法
  • Oracle不能删除表 ORA-00604 ORA-01422 错误
  • 如何得到带有ora的行的下一行
  • ORA-12514及ORA-28547错误解决方案
  • 如何配置 linux 下 oracle 的 listener .ora 和
  • 浅析如何在tnsnames.ora中配置监听
  • Orcle的package中访问其它Schema的表报错ORA-00942解决方法
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • [Oracle] 浅析令人抓狂的ORA-01555问题
  • 解决报错ora-32035的方法分析
  • aq.executeQuery: ORA-00020: maximum number of processes (59) exceeded
  • Oracle 数据库闪回功能设置出现ORA-19809和ORA-19804错误
  • solaris10 安装 ora9.2.0.1 时报错
  • 在UNIX下,我的ORA817该怎么样才可以自己启动呀?
  • 基于ORA-12170 TNS 连接超时解决办法详解
  • plsql连接oracle数据库报ora 12154错误解决方法
  • 安装oracle出现error:ora-01031:insufficient privilleges的解决
  • 谁能帮忙解释一下: ORA-01000 : maximun open cursors exceeded


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,