本文给大家讲述下遇到的oracle字符集的问题。
前些日子公司刚刚把oracle10g升级到11g,在运行项目的时候是正常的,突然发现只有在使用oracle存储过程新增的时候报空指针异常。
开始以为是客户端的值没有传成功,经过调试,发现java数组转oracle对象的时候出现乱码。于是执行命令select * from nls_database_parameters,显示字符集ZHS16GBK,原来的10G的字符集是AL32UTF8,终于找到了症结所在,是字符集的问题。
下面是最初oracle对象定义:
CREATE TYPE type_name AS OBJECT( username varchar(20) )
为了解决问题,网上了很多资料,花了很多步骤
1.原先以为是ORACLE驱动包的问题,升级了ojdbc.jar,发现没有解决。
2.根据网上资料介绍说是要引入包nls_charset12.jar和orail18n.jar,于是我又下载了并引入,
发现不是报Java.lang.NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOG
就是项目运行不了。依然没法解决。
3.皇天不负有心人终于我把varchar2改成nvarchar2完美解决。
最后的对象定义(正确解决):
CREATE TYPE type_name AS OBJECT( username nvarcahr2(20) )
最后说一下varchar2与nvarchar2的区别
NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则
1、NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
2、而VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个