数据库

 首页 > 数据库 > MySql > JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题

JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题

分享到:
【字体:
导读:
         摘要:数据库版本:Oracle 10g字符集:SIMPLIFIED CHINESE_CHINA.US7ASCIIJDK:1.6.0_45Oracle驱动:ojdbc14.jar使用JDBC操作数据库,获取连接、执行SQL没有问题。但是,查询出来的结果中,所有汉字,均显示为乱码。debug查看到在数据从数据库中获取出来的时候,...

JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题

数据库版本:Oracle 10g

字符集:SIMPLIFIED CHINESE_CHINA.US7ASCII

JDK:1.6.0_45

Oracle驱动:ojdbc14.jar

使用JDBC操作数据库,获取连接、执行SQL没有问题。但是,查询出来的结果中,所有汉字,均显示为乱码。

debug查看到在数据从数据库中获取出来的时候,就已经是乱码,而使用PL/SQL等工具,均显示正常。

不知是否Oracle的驱动,在进行汉字处理的时候,使用了系统默认的字符集?此时,本着死马当活马医的理念,使用下对汉字的强制转码,ASCII码是标准的ISO-8859-1的子集,也许使用这个ISO-8859-1可以获取到正常的汉字?于是,首先测试使用new String(fieldValue.getBytes("ISO-8859-1"));输出依然乱码!想想应该是将这东西进行转码,而不仅仅是按照这个格式获取,于是调整为:new String(fieldValue.getBytes("ISO-8859-1"), "GBK"),测试下,搞定!只是,所有用到汉字的地方,均需要这么搞一下,有点麻烦。

据说,可以使用另外一种方式:改Oracle的字符集!

1、需要修改注册表:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0NLS_LANG 的值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK

2、修改一个系统变量NLS_LANG.

以上两种,第二种方式试过,可以。第一种,未在现有环境下做过测试。

另外,将获取到的汉字,写入另外一个oracle 11g的数据库中,发现:汉字不是按照一个汉字两个字节来存放的;而是一个汉字3个字节!

查了一下,发现:字符集是AL32UTF8,这个字符集一般都默认中文是3个字节。于是,需要将目标数据库表的字段长度进行扩充。实际对于汉字的问题,oralce以及较新的sqlserver,都支持nvarchar的格式,对于使用nvarchar的字段,无论汉字还是数字、字符、英文字母,均每个字符占用1位。

如果不确定当前一个汉字占用几个字符,可以使用select length('汗') from dual;进行查看。

对于US7ASCII的字符集,目前来看,新上的系统使用的较少了,而对于一些较老的遗留系统,可能会存在这种情况。具体还需注意!

JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题
分享到:
牛腩新闻发布系统--学习Web的小技巧汇总
牛腩新闻发布系统--学习Web的小技巧汇总        2014年11月10日,是个难忘的日子,这一天,小编的BS学习开始了,BS的开头,从牛腩新闻发布系统开始,之前学习的内容都是CS方面的知识,软考过后,开始学习BS,接触BS有几天的时间了,跟着牛腩老师敲着牛腩新闻发布系统,感觉棒棒哒,看了前面二十集,发现牛腩老师真的是...
PHP安装Redis扩展教程
PHP安装Redis扩展教程安装redis 下载软件包phpredis  https://github.com/nicolasff/phpredis uzip  master    #解压得到 phpredis-master cd  phpredis-master  #进入安装目录 /www/wdlinux/php/bin/phpize  #用phpize生成configure配置文件 ./configure --with-php-config=/www/wdlinux/php/bin/php-config  #配...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……