我很难将Unicode (MS: nvarchar(length))数据从Oracle列中提取出来。
连接通过MS驱动程序进行。在SSIS工具箱中,源代码/dest如下所示:

我想我应该直接进入Source组件的高级编辑器,并将外部列和输出列都更改为DT_WSTR类型。不去。只要我单击OK,然后返回到Adv.Editor,它就会翻转回DT_STR。我不记得有任何其他的线人表现如此恶劣。请注意,这种翻转发生在执行之前,甚至在验证之前。ValidateExternalMetaData开或关都没有区别。
查看这个答案,我发现了Oracle服务器的NLS_CHARACTERSET设置,以及本地机器注册表中的设置:
(我在Oracle服务器上运行了这个程序:
SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';)
Oracle : AL32UTF8本地机器(注册表):AMERICAN_AMERICA.WE8MSWIN1252
然后在源中尝试在Oracle SQL中进行一些转换。这是:
CONVERT(THECOLUMN,'WE8MSWIN1252','AL32UTF8') AS THECOLUMN,没有效果。
这是:
CONVERT(THECOLUMN,'UTF8','AL32UTF8') AS THECOLUMN,产生了一个奇怪的效果。非英语字符(特别是波兰语Ł)在预览版中表现得很完美。但是,一旦数据离开源(在data中查看),它就回到了“一些字符ASCII 26而不是Ł--一些更多的字符”。并且SSIS数据类型仍然是DT_STR,并且拒绝更改为DT_WSTR。
我卡住了。有人能帮忙吗?
编辑:更多信息谢谢大家的评论。
Context --我正在处理一个包含400个软件包的ETL安装,因此更改驱动程序是很困难的。出于“原因”,我甚至不能访问Oracle DAS,除非在一台服务器上(实际上,远程桌面到该服务器)。因此,没有DBA/sysadmin的参与,就不可能摆弄服务器注册表设置/语言等。司机信息:

在ODBC驱动程序中:

在引用的其他问题中,可能的驱动程序列表与我的情况并不完全匹配,因为我试图通过SSIS而不是原始的.NET进行连接。我要做的只是:从Oracle表中获取Unicode字符数据(好的,这可能是一个视图,但这是我力所能及的),通过SSIS将其连接到一个MS-SQL nvarchar列中。
Oracle中的数据显然是某种类型的Unicode (参见上面预览版的测试)。然而,Source组件显然认为它是DT_STR (SSIS数据类型对应于varchar)。并拒绝通过高级编辑器接受该列类型的“硬覆盖”。因此,虽然在预览中(在Source组件实际获取数据之前)数据是正确的(带有波兰字符),但一旦它击中Source组件,它就已经损坏,“用ASCII(26)替换任何非ASCII”。
按照韦恩弗里德的建议运行这个程序:
SELECT TheColumn,DUMP(TheColumn,1016)给我这个
Typ=1 Len=10字符Set=AL32UTF8: 50,4c,55,41,54,52,45,47,c5,81
猜测这意味着什么:如果我做了MS
SELECT CHAR(CONVERT(int,0x50))对于每个十六进制值,字符都是有意义的,直到C5 (“C5”)和81 ("")为止。也许Oracle服务器使用的编码与本地Server上的编码不同。
但我的主要问题是,除了非Unicode文本之外,其他任何东西都要通过SSIS。
发布于 2022-10-21 10:24:24
DUMP的结果是完美的,当然您不需要任何CONVERT。
我认为问题是过时的ODBC驱动程序"Microsoft ODBC for Oracle",它是基于Oracle 7.3x的!
Oracle的ODBC驱动程序不支持任何新的Oracle8数据类型- Unicode数据类型、BLOB、CLOBs等等。
第二个驱动程序“驱动程序”是我从未见过的。根据的驱动程序历史记录的说法,这也是不可取的。
您应该使用Oracle提供的ODBC驱动程序,您可以从Microsoft Windows 32位的Oracle即时客户端下载或Oracle客户端下载Microsoft (x64) 64位下载"ODBC“。
https://stackoverflow.com/questions/74142700
复制相似问题