2

我使用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

准备好我的问题后,我找到了解决方案。我会将其发布为答案。但我仍然希望,有更好的方法。

4

2 回答 2

3

如果你可以避免它,你真的不想使用 ado 适配器(对于只读工作负载没问题,但我不建议将它用于其他工作负载)。我会尝试 tinytds 适配器,因为我相信它会正确处理编码,并且默认为 UTF-8。

Sequel 本身不进行任何转码,它将编码的处理留给较低级别​​的驱动程序。

于 2012-04-10T16:38:43.787 回答
1

在准备好我的问题后,我自己找到了解决方案。

当我添加一个

Encoding.default_external='utf-8'

对于我的代码,我得到了正确的结果。

作为副作用,每个File.open人现在还期望 UTF-8 编码的文件(这可以被 中的附加参数覆盖File.open)。

作为替代方案,这也适用:

Encoding.default_internal='utf-8'

正如我在问题中提到的,我不喜欢更改全局设置,只是为了更改一个界面的行为。

所以我仍然希望有更好的解决方案。

于 2012-04-10T15:34:14.293 回答