Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413123
  • 博文数量: 116
  • 博客积分: 7087
  • 博客等级: 少将
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-19 23:32
文章分类

全部博文(116)

文章存档

2012年(1)

2011年(2)

2010年(10)

2009年(21)

2008年(18)

2007年(12)

2006年(21)

2005年(31)

我的朋友

分类: DB2/Informix

2007-01-17 14:03:54

今天终于搞清楚jdbc开发显示中文的问题了。
其实,问题的根源在于codeset上。在这里我就好好解释一下。
首先,让我们来看看数据库的实现。
    数据库不能够脱离字符集独立存在,它一定属于某种字符集。
    informix数据库,默认使用iso-8859_1的字符集。这样的数据库只支持单字节。虽然可以往里面保存多字节的数据,但是数据库本身只是简单的认为,这些数据只是单字节的数据。无论你存入的是双字节的中文,还是4字节的unicode数据,数据库本身只是把它当为单字节而已。
    理解了这一点,我们再来看看用jdbc连接数据库做操作的时候,发生了什么事情。
    客户端通过jdbc连接上数据库,并提取数据后。数据按照数据库默认的编码方式被提取到客户端。客户端要将其转换成unicode。因为jdbc是基于java的,而java内部全部是unicode编码。
    那么在客户端进行转换的时候,就有问题了。到底按那种格式转?
    如果数据库的默认codeset是iso-8859_1,那么是不是就按iso-8859_1转unicode就好了?可能很多人都会说,应该是吧。
    这样的理解,只是对了一部分。
    如果保存在数据库中的数据都是iso-8859_1中包含的字符,那么这样操作没错。但是如果是数据中有中文,那么这样操作就错了。
    例如,汉字“中文”的ascii码为0xD6 0xD0 0xCE 0xC4,而常用的汉字codeset为cp936。如果按照cp936转unicode,则转换的结果是0xE4 0xB8 0xAD 0xE6 0x96 0x87;如果按照iso-8859_1转换则结果是0xC3 0x96 0xC3 0x90 0xC3 0x8E 0xC3 0x84.
    你看,同样的数据,就是因为指定不同的原始字符集,导致转换成unicode的时候,结果截然不同。所以在用jdbc连接数据库的时候,有必要把这个转换关系给说清楚。
    在informix jdbc中是通过newcodeset来说明问题的。
    newcodeset的格式如下:
    newcodeset=jdk codeset, ifx codeset,ifx codenum
    在这里,我们就要说清楚,数据库是按什么字符集存放数据的,取到客户端java时,这些数据需要按照什么样的字符集转换成unicode。
    说明白这两件事情,就能够正确显示中文了。
    具体的连接串例子如下:
    jdbc:informix-sqli://192.168.0.1:5555/cbs:informixserver=cbs;user=informix;password=informix;NEWLOCALE=zh_cn,en_us;NEWCODESET=cp936,8859-1,819;
 
 
 
   
 
    
 
阅读(2477) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~