首页 技术 正文
技术 2022年11月10日
0 收藏 809 点赞 2,810 浏览 1287 个字

背景:


项目使用oracle数据,在开发环境测试一些正常。项目部署到客户的服务器上后,系统在添加数据的时候报错。输出错误信息,发现是“超出最大长度”的异常。但是按照数据库的设计,添加的数据应该在允许的数据长度范围内。那么是什么原因导致的呢,因是客户自己按照的oracle数据库,怀疑是部署环境的oracle参数设置和开发环境的不同。 过程:查询oracle的相关参数:select * from nls_database_parameters;开发数据库和部署数据的查询结果如下:开发数据库:客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)部署数据库:客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)经比较,发现开发库和部署库的 nls_characterset参数的值是不同的。那么一个汉字和一个英文字母在开发库和部署库中各自占几个字节呢? 我们可以用sql语句查询一下。select lengthb(‘金’) from dual;

select lengthb(‘a’) from dual;

 

开发库 部署库
客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)

经查询一个汉字在开发库中占2个字节,而在部署库中占三个字节。 我们可以进一步看一下“金”这个汉字在开发库中和部署库中到底存储成了什么。使用语句:  select dump(‘金’,1016) from dual;

开发库 部署库
客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)

可以看到汉字“金”在开发库中存储为  bd f0 占用2个字节,而在部署库中存储为 e9 87  91 占用3个字节。 结论:那么根据以上的信息,我们可以得出结论 当nls_characterset=zhs16gbk 时,一个汉字在oracle中占用2个字节,当nls_characterset=al32utf8时,一个汉字在oracle中占用3个字节。 解决问题:现在原因基本上已经找到了,那么如何解决。这也就到了我今天想要表达的主题“规避风险”。网上一搜,发现遇到此问题的同学还是比较多的,下面给出了修改nls_characterset和nls_length_semantics参数的方法,都可以使问题得到解决。但是修改参数可能带来的后果是非常严重的,风险系数比较高。是采用修改参数的方法是另辟蹊径。我选择了后者。 那么是否可以将数据库中的varchar2类型的字段长度扩充进而规避该问题,虽然该方法也有一定的弊端,可以在项目扩充上会有遗留问题,但是在目前来看不失为一个低风险的好方法。生成扩充脚本的sql语句如下 : select ‘alter table ‘||table_name||’ modify ‘||column_name||’ VARCHAR2(‘||data_length*2||’);’  from cols  where data_type = ‘VARCHAR2’ 

and table_name in (select table_name from tabs where status = ‘VALID’)

 生成数据脚本如下:客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险) 参数资料:http://www.itpub.net/thread-838447-1-1.htmlhttp://blog.csdn.net/lanyunit/article/details/5768581

下一篇: iOS的触摸事件
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,130
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,601
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,444
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,218
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,852
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,940