我正在将数据从使用异构服务(通过 ODBC)访问 SQL Server 上的数据的 VMS 上的 Oracle 迁移到通过 Oracle 网关(dg4msql)访问 SQL Server 的 AIX 上的 Oracle。Oracle VMS 数据库使用 WE8ISO8859P1 字符集。AIX 数据库使用 WE8MSWIN1252。根据 sp_helpsort,SQL Server 数据库对 Unicode 数据使用“Latin1-General、不区分大小写、区分重音、不区分假名、不区分宽度,对于非 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。select dump(column) from table 返回 Typ=1 Len=6: 0,67,0,79,0,88 当值为 'COX' 是否从远程链接选择到 sql server 时,转换文字 'COX'到 nvarchar,或作为 nvarchar 复制到 Oracle 表中。但是当我选择列本身时,它仅在从远程 sql 服务器链接中选择时才会出现额外的空格。我不明白为什么 dump 会返回相同的东西,但不使用 dump 会显示不同的值。任何帮助表示赞赏。