我使用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-connection 进行了连接:
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
并使用它作为提供者。但我得到一个无效的连接字符串属性-error(与 相同sqlncli
)。
所以我的最后一个问题是:如何通过 ruby 和 sequel 读取 MS-SQL 中的 UTF-8 数据?
我的环境:
客户:
- Windows 7的
- 红宝石 1.9.2
- 续集 3.33.0
数据库:
- SQL 服务器 2005
- 数据库有排序规则 Latin1_General_CI_AS
准备好我的问题后,我找到了解决方案。我会将其发布为答案。但我仍然希望,有更好的方法。