首页 文章

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

提问于
浏览
4

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

“链接服务器”PROD“报告错误 . 提供程序未提供有关错误的任何信息...无法从OLE DB提供程序”OraOLEDB.Oracle“获取链接服务器”PROD“的行 .

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

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

错误:

OLE DB提供程序“OraOLEDB.Oracle”用于链接服务器“PROD”返回消息“01” . 用于链接服务器“PROD”的OLE DB提供程序“OraOLEDB.Oracle”返回消息“ORA-29275:部分多字节字符” .

我可以将违规的NAME列作为DUMP查询,如下所示:

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)...重建,然后我得到“MIXTECODETIDAÁ” . 看来,底线是Oracle数据中的CHAR(193)导致我的查询失败 . 但是如何解决?

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

ORA-29275:部分多字节字符原因:请求的读取操作无法完成,因为在输入的末尾找到了部分多字节字符 . 操作:确保从远程服务器发送完整的多字节字符,然后重试该操作 . 或者将部分多字节字符读为RAW .

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

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

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

在SQL中,sp_helpsort返回:

Latin1-常规,不区分大小写,区分重音,对kanatype不敏感,对Unicode数据不区分宽度,对于非Unicode数据,对代码页1252上的SQL Server排序顺序52

在Oracle中,NLS_CHARACTERSET是:AL32UTF8

任何帮助:为什么这不起作用或如何使这工作?如果需要进一步的信息,请告诉我 .

1 回答

  • 3

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

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

相关问题