当平面文件是 ANSI 而不是 UTF8 时,Openrowset 问题与元音变音/代码页

问题描述 投票:0回答:0

我在使用 OPENROWSET 时遇到变音符号问题(示例:Empänger)。在我们使用 Windows Server 2012、SQL-Server 2012 和没有 UTF-8 (Latin1_General_CI_AS) 的 COLLATION 的旧环境中,一切都没有问题地运行。在大多数情况下,我们的平面文件都是 ANSI(我认为是 cp1252)。
现在我们更改为 Windows Server 2016、SQL-Server 2019 和 UTF-8 排序规则 (Latin1_General_100_CI_AS_SC_UTF8) 并遇到德语变音符号问题(像 Übung 一样的变音符号)。

我们有许多用户使用上传文件的能力并将它们用作 SSRS 中的扩展版本。所以如果它只是一个改变的选择就好了。

我们的原始脚本在 UTF-8 下运行良好,但它在 ANSI 中返回错误的字符:

SELECT * FROM OPENROWSET('MSDASQL','Driver={Microsoft Access Text Driver (*.txt, *.csv)}','select * from \\localhost\_RepUploader\FlatFileTest_ANSI.csv')

这就是我得到的:“Emfpfänger”>>“Empf�nger” 当我从 ANSI tu UTF-8 更改编码时,我得到了正确的拼写。

这是该文件的内容:

FirstWord;SecondWord
Empfänger;Üben

在“Schema.ini”中,我尝试了不同的 CharakterSet 选项:“1252,65001,OEM,ANSI,1250”以及已知代码页之间的其他选项。没有运气。

我知道它使用 Polybase External_Table 连接。我还使用了 BULK INSERT 和代码页 1252。

drop table if exists #tmp
create table #tmp (FirstWord varchar(100), SecondWord nvarchar(100))
bulk insert #tmp
from '\\localhost\_RepUploader\FlatFileTest_ANSI.csv'
with
(
    fieldterminator = ';',
    codepage = 1252,
    FIRSTROW = 2    
)
select 'ANSI File', * from #tmp

在我看来,Polybase Connection 使用 Schema.ini,因为当我尝试 CharacterSet=65001 时,我得到了错误的字符。当我取消注释或使用 CharacterSet=1252 时,一切都很好。那么 Polybase 如何选择正确的字符。

sql-server utf-8 ansi sql-server-2019 flat-file
© www.soinside.com 2019 - 2024. All rights reserved.