zoukankan      html  css  js  c++  java
  • 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的字符集,眼下来看,新上的系统使用的较少了,而对于一些较老的遗留系统,可能会存在这样的情况。详细还需注意!

  • 相关阅读:
    在公司中使用springboot技术的经验
    使用swagger2代替api文档
    第一份正式工作-华为外包。
    zookeeper学习入门
    dubbo入门
    C/C++编程笔记:inline函数的总结!C/C++新手值得收藏!
    刚毕业入职程序员?程序员需注意这 6 点!都是前辈“血的教训”
    你在群里提的技术问题没人回答!是为什么?因为没注意这 4 点!
    程序人生:程序员想要提升英文阅读能力怎么办?实用秘籍推荐!
    程序员必看:长期工作的程序员转眼变油腻大叔!你今天护肤了吗?
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4307512.html
Copyright © 2011-2022 走看看