SQL Server连接Informix链接服务器字符转换及初始化问题求助
我之前处理过好几起SQL Server链接Informix时的字符编码兼容问题,结合你的情况,给你分步骤的解决思路:
一、先搞定核心的字符转换错误
你遇到的€、š这类特殊字符转换失败,本质是Informix数据库的字符编码和SQL Server链接服务器的客户端编码不匹配,导致这些字符无法被正确映射。
1. 先确认Informix的实际编码配置
首先得搞清楚你的Informix数据库用的是什么编码,在Informix服务器上执行以下SQL:
SELECT DB_LOCALE, CLIENT_LOCALE FROM sysmaster:sysdbslocale WHERE dbsname = '你的目标数据库名';
或者用Informix的命令行工具执行onstat -g glo,查看全局的Locale配置信息。
2. 修正链接服务器的Locale配置(解决7303错误)
你之前取消Locale配置行后出现7303错误,大概率是Locale值拼写错误或者ODBC驱动不支持指定的Locale:
- 先检查IBM INFORMIX ODBC Driver的版本:确保驱动位数和SQL Server一致(64位驱动配64位SQL Server,32位同理),且驱动安装时包含了所需的Locale文件(部分精简版驱动会缺省Locale组件)。
- 尝试用更精准的Locale字符串,比如如果Informix用的是UTF-8编码,修改链接服务器脚本为:
DECLARE @provider NVARCHAR(4000); SET @provider = N'Driver={IBM INFORMIX ODBC DRIVER};' + N'SERVICE=1526 ;' --Informix服务名称 + N'PROTOCOL=onsoctcp ;' --Informix协议 + N'DB_LOCALE=en_US.UTF8; CLIENT_LOCALE=en_US.UTF8;'; EXEC master.dbo.sp_addlinkedserver @server =N'LS_INFORMIX', --链接服务器系统名称 @srvproduct=N'Ifxoledbc', @provider=N'Ifxoledbc', @datasrc=N'xxx@yyyyyy', --Informix数据库 @provstr= @provider;
如果你的Informix用的是ISO-8859-15(支持€、š),则把Locale改成en_US.8859-15。
3. 查询时显式指定编码转换
如果暂时无法调整链接服务器的全局配置,可以在查询时对问题列做显式转换,比如:
SELECT CAST(your_problem_column AS VARCHAR(255) COLLATE Latin1_General_100_CI_AS_SC) AS fixed_column, -- 其他列 FROM OPENQUERY(LS_INFORMIX, 'SELECT your_problem_column FROM your_informix_table')
这里的Latin1_General_100_CI_AS_SC是SQL Server中支持扩展字符的排序规则,对应ISO-8859-15编码。
二、临时应急方案(如果需要快速取数)
如果上面的配置一时无法生效,可以先采用以下临时方案:
- 过滤掉含特殊字符的记录:
SELECT * FROM OPENQUERY(LS_INFORMIX, 'SELECT * FROM your_informix_table WHERE your_problem_column NOT LIKE ''%€%'' AND your_problem_column NOT LIKE ''%š%''')
- 先转二进制再转回字符串,绕过编码校验:
SELECT CONVERT(VARCHAR(255), CONVERT(VARBINARY(255), your_problem_column)) AS fixed_column FROM OPENQUERY(LS_INFORMIX, 'SELECT your_problem_column FROM your_informix_table')
三、额外排查点
- 检查SQL Server的服务器级排序规则:执行
SELECT SERVERPROPERTY('Collation'),确保它支持你要转换的特殊字符(比如带_SC后缀的排序规则支持补充字符)。 - 确认Informix的Char列长度足够,避免因字符截断导致的隐性转换错误。
- 尝试用ODBC数据源管理器手动创建Informix的DSN,测试连接和取数是否正常,然后在链接服务器中用这个DSN作为
@datasrc,这样更容易定位配置问题。
内容的提问来源于stack exchange,提问作者Gica
相关产品推荐
相关产品推荐

