ORA-12899: value too large for column

php中文网
发布: 2016-06-07 17:27:01
原创
2939人浏览过

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。

Remove.bg
Remove.bg

AI在线抠图软件,图片去除背景

Remove.bg 102
查看详情 Remove.bg

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号