2

私はruby-gemの続編を使用して、MSSQL-Serverテーブルからutf-8でエンコードされたデータを読み取ります。表のフィールドは次のように定義されnvarcharています。MicrosoftServerManagementStudioでは正しく表示されます(キリル文字はキリル文字で、中国語は中国語に見えます)。

データベースを

  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)。

だから私の最後の質問:ルビーと続編を介してMS-SQLでUTF-8データを読み取るにはどうすればよいですか?

私の環境:

クライアント:

  • Windows 7
  • Ruby 1.9.2
  • 続編-3.33.0

データベース:

  • SQL Server 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'

私のコードでは、正しい結果が得られます。

副作用として、 eachFile.openは UTF-8 でエンコードされたファイルも期待するようになりました (これは の追加パラメータで上書きできますFile.open)。

別の方法として、これも機能します。

Encoding.default_internal='utf-8'

質問で述べたように、グローバル設定を変更するのは好きではなく、1 つのインターフェイスの動作を変更するだけです。

だから私はまだより良い解決策を望んでいます。

于 2012-04-10T15:34:14.293 に答える