OPENROWSET读取ANSI编码文件时德语变音字符乱码问题
问题背景
旧环境(Windows Server 2012、SQL Server 2012,排序规则Latin1_General_CI_AS)中,使用OPENROWSET读取ANSI(cp1252)格式文件时,德语变音字符(如Empfänger、Übung)显示正常。升级至新环境(Windows Server 2016、SQL Server 2019,UTF-8排序规则Latin1_General_100_CI_AS_SC_UTF8)后,读取ANSI文件时变音字符出现乱码(如Empf�nger),但读取UTF-8文件正常。原OPENROWSET脚本对ANSI文件失效,调整Schema.ini的CharacterSet参数(1252、65001等)无效果,但通过BULK INSERT指定代码页1252或Polybase外部表可正常读取。
可行解决方案
方案1:使用Microsoft ACE OLEDB驱动替代旧Access Text Driver
新环境下,旧的Access Text Driver对UTF-8排序规则的SQL Server兼容性较差,改用ACE驱动可更好处理字符集映射:
确保Schema.ini配置正确(与CSV文件同目录)
创建或修改Schema.ini,内容如下:[FlatFileTest_ANSI.csv] Format=Delimited(;) CharacterSet=1252 ColNameHeader=True调整OPENROWSET脚本
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Text;Database=\\localhost\_RepUploader;CharacterSet=1252;', 'SELECT * FROM FlatFileTest_ANSI.csv')注:若服务器未安装ACE驱动,需先安装对应位数的Microsoft Access Database Engine 2016 Redistributable。
方案2:优化MSDASQL驱动的连接字符串
若必须保留原MSDASQL驱动,需在连接字符串中明确指定字符集,并将文件目录作为Dbq参数传入:
SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=\\localhost\_RepUploader;CharacterSet=1252;', 'SELECT * FROM FlatFileTest_ANSI.csv')
此方式可强制驱动读取指定代码页的文件,避免因SQL Server UTF-8排序规则导致的字符映射错误。
验证方法
执行调整后的OPENROWSET脚本,检查结果集中的Empfänger、Üben等德语变音字符是否正常显示,无乱码。
内容的提问来源于stack exchange,提问作者Vincent Vega

