今天终于搞清楚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;
阅读(2562) | 评论(0) | 转发(0) |