由于informix数据库的代码集被设置为en_us.8859-1,因此在使用csdk 2.8以及以上的驱动程序时,都会因为这个错误的字符集设定而无法正常显示汉字。这里是一个比较彻底的解决方案:
万能的互联网,千万要让这个文章永远地存在下去呀!
informix CSDK 在2.8以前,默认情况下使用 Garbage In, Garbage Out 模式处理中文字符,若数据库服务器上的 DB_LOCALE 采用默认的 en_us.8859-1 字符集,能够正常支持中文字符。但是升级到 CSDK2.8 及以上版本时,不再支持 Garbage In, Garbage Out 模式,将出现乱码问题。该情况下,建议更改数据库的字符集(设置 DB_LOCALE=zh_cn.GB18030-2000,重新创建数据库),然后按本文中描述的方法进行 DB_LOCALE 与 CLIENT_LOCALE 的设置方法进行处理。若在实际环境下重建数据库成本太高,可以考虑如下步骤进行解决 ODBC 支持中文的问题。
数据库服务器端:
1. 设置环境变量: IFMX_UNDOC_B168163=1;export IFMX_UNDOC_B168163
2. 将 en_us.8859-1 字符集文件拷贝到 zh_cn 目录下
cd $INFORMIXDIR/gls/lc11
cp ./en_us/0333.lco ./zh_cn
3. 重新启动 IDS
客户端:
odbc里,可以在数据源配置里设置如下:
DB_LOCALE=zh_cn.GB18030-2000
CLIENT_LOCALE=zh_cn.GB18030-2000
也可以在连接串里增加设置:
dsn=xxx;uid=xxx;pwd=xxx;DLOC=zh_cn.GB18030-2000;CLOC=zh_cn.GB18030-2000;
使用IBM.Data.Informix.IfxConnection的,可以这样设置connection对象:
conn.ClientLocale = "zh_cn.GB18030-2000";
conn.DatabaseLocale = "zh_cn.GB18030-2000";
对于 JDBC 我们可以通过 NEWCODESET 来解决该问题:
URLString = "jdbc:Informix-sqli://9.125.66.130:6346/dbname:InformixSERVER=servername;
NEWCODESET=GB18030-2000,8859-1,819;
CLIENT_LOCALE=en_US.8859-1;DB_LOCALE=en_US.8859-1;"
在64位系统中,系统中有两个odbc管理器,即32位版与64位版。分别对应于不同版本的数据源驱动程序。对应的管理器只能配置与管理对应版本的数据源。不同版本的数据源可以重名,即可以同时存在一个32位的"testconn"和一个64位的"testconn",它们的连接字符串都是一样的:"dsn=testconn;uid=informix;pwd=xxxxxx"
在64位windows系统上安装informix cli驱动时,可以安装32位版或是64位版,或是两者都装,但会有一些冲突。
只安装64位版cli驱动时,所有的应用程序必须编译为x64位版本,或是anycpu(需要测试)。64位应用程序只能使用64位cli驱动程序,也只能使用64位odbc源。
只安装32位版cli驱动时,所有的应用程序必须编译为x86(32位)版本才能运行。也只能使用32位odbc数据源。如果是ASP.net应用,必须在iis里为应用程序池设置“允许运行32位应用程序”。
在windows server 2008\2008 r2\2012 的x64版本的各系统上,也可以同时安装x64版本与32位版本cli。但是由于安装过程、先后顺序、环境变量等问题,可能会造成其中一个不能正确连接数据库的情况。建议如下处理:
64位版的cli驱动安装于 "c:\program files\" 下。
32位版的驱动则应该安装于 "c:\program files (x86)\" 下,在安装前,需要在系统环境变量 path 中设定一个 "c:\windows\syswow64;" 到所有的项目之前。
在设定数据源时,如果某个cli的数据源无法连接数据库,报告“unable to load translation shared library”,那么请为该数据源设定Translator lib项目为“C:\Program Files\Informix\Client-SDK\bin\igo4n304.dll”或是“C:\Program Files (x86)\Informix\Client-SDK\bin\igo4n304.dll”.
最后:好像直接修改数据库里的systables表里,tabname = ' GL_COLLATE' or ' GL_CTYPE' 的site字段的内容,比如从 'en_US.819' 改为 'zh_CN.GB18030-2000' 也可以直接修改掉数据库的字符集设定。简单测试了一下似乎没有问题,但没敢多试就改回来了。