ruby - MSSQL-Server/ruby-gem 续集 : How to read UTF-8 values?

标签 ruby sql-server sql-server-2005 encoding sequel

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

相关文章:

ruby-on-rails - 如何在 ruby​​/rails 中将多个参数传递给 Proc?

Ruby:如何在正则表达式中匹配双引号

用于更改所有外键以添加 ON DELETE CASCADE 的 SQL 脚本

sql - 区分空和 NULL 查询结果

sql-server - 我可以在存储过程中设置默认架构吗?

sql - 过滤 SQL 行

ruby - 你如何模拟 OpenCascade?

ruby-on-rails - 在 Ruby on Rails 中推送到数组

C# :Does Client machine need SQL Server installed on it while connecting to other machine having SQL Server installed on it (the Server machine)

sql - 无法重命名临时表的列