web-dev-qa-db-ja.com

PerlTDS文字セット

私はDBD :: SybaseでFreeTDSドライバーを使用しており、MS SQLServerに接続しています。特定のレコードの特定の値を照会すると、次のエラーが発生します。

DBD::Sybase::st fetchrow_arrayref failed: OpenClient message: LAYER = (0) Origin = (0) SEVERITY = (9) NUMBER = (99)
Server , database 
Message String: WARNING! Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?').

これは、人々のOutlookおよびWordメッセージからコピーして貼り付けた、中引用符などの特別なWindows文字セット文字を含むレコードで発生するようです。

残念ながら、私はこのデータベースを制御できません。途中で入力をサニタイズすることは明らかに進むべき道ですが、私には利用できません。

これらのレコードを正常にクエリできるようにするには、どのFreeTDS設定を変更する必要がありますか?

追加情報:

クエリはtsqlから正常に機能します。このエラーは、PerlのDBD :: Sybaseインターフェイスを介してのみ発生します。 (他の方法でテストする必要がありますか?PHPまたはPythonをインストールするための専門知識がまだありません。jTDSを持っていて使用できますが、これはまったく異なる実装だと思います。 FreeTDSへのインターフェースではありません。)

追加

client charset = UTF-8

freetds.confファイルに「メモリ不足です!」という結果になります。 STDERRに出力されます。

7
skiphoppy

最近、同様の問題が発生しました。

Freetds.confファイルには、次のようなエントリが必要です。

[DataSourceName]
        Host = <IP Address>
        port = <databaseport>
        #version 8.0 seems to work  with sql server 2005
        tds version = 8.0
        client charset = UTF-8

ここで重要なのはクライアント文字セットです。

LinuxのPerlでこれを行っていましたが、Perlがクライアントであることを考えると、ここでもUTF-8が最良の選択だと思います

3
Matthew S

これが役立つかどうかを確認します( Sybase Manualsから 、ただしMSSQLサーバーでも機能する可能性があります):

セッション中の文字変換の制御

set char_convertを使用すると、ユーザーは特定の作業セッション中に文字セット変換がどのように動作するかを決定できます。 setchar_convertを次のように使用します。

* Set character set conversion on or off

* Start conversion into a specific character set

* Turn error reporting on or off

Setchar_convertの構文は次のとおりです。

set char_convert {off |
{on [with {error | no_error}]} |文字セット[with {error | no_error}]}

2
DVK