數據庫編碼問題--PostgreSQL篇(二)

来源:互联网 发布:excel做数据分布图 编辑:程序博客网 时间:2024/06/05 17:32

接着第一篇,继续完成postgres汉字编码问题的测试,这篇主要是测试写入数据库。

 

在读取数据库内容时,只需注意使用的驱动程序方式及数据库使用的编码格式即可,但写入的时候则要多注意一样就是客户端的编码。避免乱码的原则是,数据库编码、驱动程序访问接口编码、客户端编码三者统一。

乱码的根源是在写入的时候编码没有统一造成,因为读取造成的乱码很容易解决,如果是写入造成的乱码无论对人对程序来说都是件灾难。

 

使用ansi驱动访问SQL_ASCII编码数据库时,如果客户端设置不对,没有设成"SQL_ASCII",写入时会出现转换编码错误。当然不乱码的前提是写入编码与读取编码识别要一致,如果GB码和BIG5码混编写入,读出来的不论是以GB码或BIG5码识别都会出现乱码。使用SQL_ASCII编码时要求对写入的编码一定要统一,不能混编。

 

使用ansi驱动访问utf8编码数据库时,客户端默认设为系统本地编码。所有写入的字符都会当作客户端编码转为utf8后写入,转换失败则写入失败。如果写入的字符编码与客户端编码不一致就会出现乱码。例如繁體“國”字GB18030编码为"/x87/xf8",BIG5編碼為"/xb0/xea",當"/x87/xf8"作為BIG5碼轉到utf8時因為"/x87/xf8"不在BIG5碼表中,就會出錯。但簡體的“国”字"/xb9/xfa"却可以作为BIG5转换为utf8,但“国”字的GB2312编码"/xb9/xfa"却是繁体字的另一个字而不是“国”或“國”,这样一来就会变成乱码。

 

比较容易造成乱码的会是使用unicode驱动访问UTF8数据库。由于windows不支持utf8,pg在使用utf8方式进行处理时先对客户端的字符转换成utf8再保存到数据库中。无论简体还是繁体汉字,在使用unicode驱动时都可以任意转为utf8而不会出错。这时候如果写入的字符编码与客户端使用的编码不一致时同样会出现乱码。

 

这样看来解决乱码其实很简单,只要使用一致的编码时就可解决问题。

但需要解决的问题还是会有,在繁体平台下输入简体字、在简体平台输入繁体字。再加上全文搜索时,这样要考虑的问题就会多些。