关于jdbc 字符集和数据库字符集的问题


        今天突然想研究研究jdbc读异体字的问题,官方文档上,居然让我看到了这样一段话,一直的想法就是想让jdbc和数据库读取时不发生字符集转换来实现,看来希望没有了

In versions of the Oracle JDBC drivers prior to 10g release 1
(10.1), there were performance advantages to using
oracle.SQL.CHAR. In Oracle Database 10g, there are no longer
any such advantages. In fact, optimum performance is achieved
using java.lang.String. All Oracle JDBC drivers handle all
character data in the Java UCS2 character set. Using
oracle.sql.CHAR does not prevent conversions between the
database character set and UCS2.

         ucs2应该是utf-16,看来要在这个上想办法了。

        想了一个比较笨的办法,为了让oracle不做字符集转换,读取字段内容的时候,直接用dump函数返回字符的编码 substr(dump(col,16),instr(dump(col,16),':')+2)
        这样从java中读到的其实就是这个字段的16进制编码,是用‘,'分割的
        String   name=rs.getString(1);
        String[] name1=name.split(",");
         int x=name1.length;
         Integer[] name2=new Integer[x];
         byte[] byte1=new byte[x];
         for (int i=0;i         {
                 name2[i]=Integer.valueOf(name[1],16);
                 byte1[i]=name2[i].byteValue();
         }
        String str=new String(byte1);
        System.out.println(new String(str.getBytes("ISO8859-1")));
        
        这个办法有点笨,但是对一些异体字的读取还是有帮助的

        其实造成异体字的主要原因是:
        oracle数据库服务端和客户端的字符集一致时,当客户端输入的字符不是 数据库字符集所包含的字符时,oracle数据库由于客户端服务器端字符集一致,不做字符集转换,直接将编码存入数据库中
        在读取的时候,如果客户端和服务端的字符集一致,数据库直接将编码返回,客户端操作系统只要支持该字符,显示就是正常的
        但是如果客户端和服务端字符集不一致,这时候,数据库服务器将进行字符集转换,但是该字符本身是不存在的,所以就会出现‘?’这种情况了

        jdbc从oracle10g开始,都是通过unicode进行转换的,无法避免,所以会导致出现即使网页或客户端是支持该字符的情况,返回的也还是‘?’


       

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3326/viewspace-566992/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/3326/viewspace-566992/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值