【问题标题】:Character set issues with Oracle Gateways, SQL Server, and Application ExpressOracle 网关、SQL Server 和 Application Express 的字符集问题
【发布时间】:2010-03-25 21:30:17
【问题描述】:

我正在将数据从使用异构服务(通过 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 会显示不同的值。任何帮助表示赞赏。

【问题讨论】:

    标签: sql-server oracle character-encoding gateways


    【解决方案1】:

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

    【讨论】:

    • 我会添加查找适当的排序规则(可能来自 Oracle NLS Lang FAQ),并在视图中使用 COLLATE 来明确定义翻译。
    【解决方案2】:

    您可能对Oracle NLS Lang FAQ 感兴趣

    【讨论】:

    • 是的,读得很好,但没有讨论如何通过 Oracle 网关连接处理 SQL Server nchar 数据。
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多