Oracle网关,SQL Server和Application Express的字符集问题

时间:2010-03-25 21:30:18

标签: sql-server oracle character-encoding gateways

我正在从VMS上的Oracle迁移数据,该数据使用异构服务(通过ODBC)访问SQL Server上的数据到AIX上的Oracle,通过Oracle网关访问SQL Server(dg4msql)。 Oracle VMS数据库使用WE8ISO8859P1字符集。 AIX数据库使用WE8MSWIN1252。根据sp_helpsort,SQL Server数据库使用“Latin1-General,不区分大小写,区分重音,对knatype不敏感,对Unicode数据不对宽度不敏感,对于非Unicode数据使用代码页1252上的SQL Server排序顺序52”。 SQL Server数据库使用nchar / nvarchar或所有字符串列。

在Application Express中,在某些情况下会出现额外字符,例如123显示为%001%002%003。在sqlplus中,事情看起来还不错但是如果我使用像initcap这样的Oracle函数,我会在查询sql server数据库(使用数据库链接)时看到字符串的每个字母之间的空格。在旧配置下不会发生这种情况。

我假设问题是nchar中有额外的字节,而Oracle中的字符集无法转换它。似乎ODBC解决方案不支持nchars所以必须将它们转换回char并且它们显示正常。我只需要查看sql server数据,所以我可以使用任何解决方案,比如强制转换,但是我找不到任何可行的解决方案。

有关如何处理此事的任何想法?我是否应该在Oracle中使用不同的字符集?如果是这样,这是否适用于所有模式,因为我只关心其中一个。

更新:我想我可以简化这个问题。 SQL Server表使用nchar。从表中选择dump(列)返回Typ = 1 Len = 6:0,67,0,79,0,88当值为'COX'时我是否从远程链接中选择sql server,强制转换为'COX'到nvarchar,或作为nvarchar复制到Oracle表中。但是当我选择列本身时,只有从远程sql server链接中选择时才会显示额外的空格。我无法理解为什么dump会返回相同的东西,但不使用dump会显示不同的值。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

在特定版本的SQL Server上,Oracle网关和nchar之间存在不兼容性。解决方案是在SQL Server端创建视图,将nchars转换为varchars。然后我可以通过网关从视图中进行选择,并正确处理字符集。

答案 1 :(得分:0)

您可能对Oracle NLS Lang FAQ

感兴趣