我使用ruby-gem sequel从 MSSQL-Server 表中读取 utf-8 编码的数据。
该表的字段定义为 nvarchar
,它们在 Microsoft Server Management Studio 中看起来是正确的(西里尔字母是西里尔字母,中文看起来是中文)。
我连接我的数据库
db = Sequel.connect(
:adapter=>'ado',
:host =>connectiondata[:server],
:database=>connectiondata[:dsn],
#Login via SSO
)
sel = db[:TEXTE].filter(:language=> 'EN')
sel.each{|data|
data.each{|key, val|
puts "#{val.encoding}: #{val.inspect}" #-> CP850: ....
puts val.encode('utf-8')
}
}
这对于英语来说效果很好,德语也返回一个可用的结果:
CP850: "(2 St\x81ck) f\x81r
(2 Stück) für ...
但是结果转换为CP850
,并不是原来的UTF-8
。
西里尔语言(我用保加利亚语进行了测试)和中文仅产生“?”
(合理,因为 CP850
不包含中文和保加利亚语字符)。
我还通过 odbc 连接进行连接:
db = Sequel.odbc(odbckey,
:db_type => 'mssql', #necessary
#:encoding => 'utf-8', #Only MySQL-Adapter
)
结果是ASCII-8BIT
,我必须使用force_encoding
将数据转换为CP1252(不是CP850!)。
但西里尔语和中文仍然不可能。
我已经尝试过:
- MySQL 适配器似乎有一个编码选项,但对于 MSSQL,我没有检测到任何效果。
- 我用sqlite和sequel做了类似的测试,并且unicode没有问题。
- 我安装了
SQLNCLI10.dll
并将其用作提供程序。但我收到无效的连接字符串属性 - 错误(与sqlncli
相同)。
所以我的结束问题:如何通过 ruby 和后续程序读取 MS-SQL 中的 UTF-8 数据?
我的环境:
客户:
- Windows 7
- ruby 1.9.2
- sequel-3.33.0
数据库:
- SQL Server 2005
- 数据库具有排序规则 Latin1_General_CI_AS
准备好问题后,我找到了解决方案。我会将其作为答案发布。 但我仍然希望,有更好的方法。
最佳答案
如果你可以避免它,你真的不想使用 ado 适配器(对于只读工作负载来说这是可以的,但我不会推荐它用于其他工作负载)。我会尝试使用 tinytds 适配器,因为我相信它可以正确处理编码,并且默认为 UTF-8。
Sequel 本身不进行任何转码,它将编码处理留给较低级别的驱动程序。
关于ruby - MSSQL-Server/ruby-gem 续集 : How to read UTF-8 values?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091742/