惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - HAL9000

旧文重发:漫谈字符集和编码 用html5 canvas和JS写个数独游戏 如何破解.net软件 夜晚才能工作的程序员 公司让各部门写春联,这是我们部门写的对子 盖茨和乔布斯 利用简单的力学法则来模拟天体运行(2) 利用简单的力学法则来模拟天体运行 一个仿windows泡泡屏保的实现 msdn版windows 8无法激活的解决办法 谁是DAC2.8和jet4.0的接班人? 一个长事务引起的血案——Informix 长事务回滚失败引起的阻塞故障处理 一些常见的星际旅行的科技名词与其"理论根据": 笔记:连接SCO上的FTP时为何那么慢 关于中文编程的段子的一个实现 VC非托管代码调用webservice,并支持代理服务器设置 天哪,我遇上了一个windows api BUG! 并贡献一个完全支持代理服务器的http文件下载VC代码 找到锁域账号的元凶 求高手指点:VC中wininet的代理服务器问题,耗了两天了,没有一点办法
informix cli 汉字乱码的解决办法
HAL9000 · 2013-04-02 · via 博客园 - HAL9000

由于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对象:

             IBM.Data.Informix.IfxConnection conn = new IfxConnection("DataBase=xxx;Server=xxx;User ID=xxx;Password=xxx");
            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' 也可以直接修改掉数据库的字符集设定。简单测试了一下似乎没有问题,但没敢多试就改回来了。