ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于jdbc 字符集和数据库字符集的问题

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

原创 Linux操作系统 作者:流浪人生 时间:2009-03-12 15:39:25 0 删除 编辑

        今天突然想研究研究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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-11-11

  • 博文量
    17
  • 访问量
    50521