sql-server - SQL Server 到 Oracle 链接服务器的字符编码

标签 sql-server oracle sql-server-2008 internationalization

在我们从 SQL Server 2005 升级到 2008R2 之前,该链接服务器工作正常,但现在在从某些表查询时会抛出此错误(它仍然适用于其他表):

"linked server "PROD" reported an error. The provider did not give any information about the error...Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "PROD".

我可以将问题缩小到一行,当我对该行运行此查询时,我收到一个不同的错误:

select * from openquery( PROD, 'SELECT ID, NAME FROM ITEMS WHERE ID = 5437')

错误:

OLE DB provider "OraOLEDB.Oracle" for linked server "PROD" returned message "01".

OLE DB provider "OraOLEDB.Oracle" for linked server "PROD" returned message "ORA-29275: partial multibyte character".

我可以将有问题的 NAME 列作为转储进行查询,如下所示:

select * from openquery( PROD, 'SELECT DUMP(NAME) FROM ITEMS WHERE ID = 5437')

返回结果:

Typ=1 Len=16: 77,73,88,84,69,67,79,32,68,69,32,84,73,68,65,193

然后使用 SELECT CHAR(77) + CHAR(73) + ... 重建,我得到“MIXTECO DE TIDAÁ”。底线似乎是 Oracle 数据中的 CHAR(193) 导致我的查询失败。但如何解决呢?

Oracle ( https://forums.oracle.com/forums/thread.jspa?threadID=551784 ) 提供了这个神秘的线索:

ORA-29275: partial multibyte character

Cause: The requested read operation could not complete because a partial multibyte character was found at the end of the input.

Action: Ensure that the complete multibyte character is sent from the remote server and retry the operation. Or read the partial multibyte character as RAW.

但是,我不知道如何“确保...”,也不知道如何“读取...作为RAW”。

SQL Server是64位版本,运行在64位Windows Server 2008R2系统上,并安装了64位Oracle 11gR2客户端。

SQL 中的列:NAME nvarchar(60) NULL Oracle 中的列:NAME varchar2(60)

在 SQL 中,sp_helpsort 返回:

Latin1-General, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 52 on Code Page 1252 for non-Unicode Data

在 Oracle 中,NLS_CHARACTERSET 为:AL32UTF8

有关以下问题的任何帮助:为什么这不起作用或如何使其正常工作?如果需要更多信息,请告诉我。

最佳答案

Oracle数据库中存储的193不是UTF-8字符集中的有效字符。 UTF-8 使用单个字节对前 128 个字符 (0-127) 进行编码,但任何超出 7 位 ASCII 的字符都需要两个或更多字节的存储空间。无论插入此数据的应用程序似乎都错误地执行了此操作,很可能是因为它配置错误,无法绕过在客户端和数据库之间传输数据时应该发生的字符集转换。

将数据插入 Oracle 数据库的应用程序使用什么语言/框架/API?客户端 NLS_LANG 参数是什么?

关于sql-server - SQL Server 到 Oracle 链接服务器的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504270/

相关文章:

sql - SQL Server 2008 中的 Open Table 去了哪里?

SQL Server 2008 - 查询以分数格式获取结果

sql-server - 您如何在数据库中表示继承?

oracle - oracle内部加密

oracle - AL32UTF8 中的前两个字符是什么意思?

sql - 从过程中仅选择几列并插入表中

sql-server-2008 - 如何理解 SQL Server 2008 中的 MERGE 关键字

mysql - 将 SQL Server 存储过程重写为 MySQL(MariaDB)

sql-server - 使用 pyodbc 从 Azure Synapse Notebook 连接到 SQL Server 时出错

database - 问题而不是在 oracle 中删除 View