Pythonで取得したSQL Server VARCHAR列のエンコードの問題


10

最近、SQL Serverでvarchar(120)として保存されているフィールドに関連するエンコーディングに問題がありました。SSMSでは、varcharは次のように表示されます。

「ジョンベンを殺したのは誰?」

ただし、Pythonに取り込むと、次のようになります。

ここに画像の説明を入力してください

私はこれをPython側から調査しましたが、奇妙なことは何も起こっていません。私の理論では、SQL Serverのvarcharは、PythonではSSMSとは異なる方法で表示されるUTF-8文字を受け入れます。SQL Serverでのエンコードについてはあまり詳しくありません。誰かが私に次のことを知らせてくれますか?

  • SSMSでvarcharのエンコーディングを表示する方法はありますか?たとえば、現在SSMSからのコンマを表示する代わりに、\ x82を参照してください。
  • SQL Server 2008を使用しています。インポート/エクスポートツールを使用したり、フラットファイルにダンプしたりせずに、UTF-8文字のエンコードをASCII文字に変更する方法はありますか?つまり、クエリを介してこの変換を行うことができますか?
  • クエリを介してプログラムで問題のあるレコードを特定する方法はありますか(問題は、ASCIIではサポートされていないUTF-8文字として定義されています)。

前もって感謝します!

使用sp_help N'table_name';して、このVARCHAR列の照合順序は次のとおりSQL_Latin1_General_CP1_CI_ASです。


そのVARCHAR列はどの照合順序を使用していますか?
ソロモンルツキー2017

@SolomonRutzky照合をどのようにチェックしますか。それが何を意味するのかよくわかりません
エリック

私が考える最も速い方法は:sp_help N'table_name';です。「名前」に基づいて列を確認してから、「collat​​ion_name」列を確認します。
ソロモンルツキー2017

@SolomonRutzkyそのフィールドの照合順序は 'SQL_Latin1_General_CP1_CI_AS'です
Eric

回答:


17

SQL Serverは、いかなる状況でもUTF-8を格納しません。UTF-16リトルエンディアン(LE)を介してNVARCHARNCHARおよびを含むが、NTEXT決して使用しませんNTEXT)およびXML、またはVARCHARCHARおよびを含むが、TEXT使用しませんTEXT)を介してコードページに基づいた8ビットエンコーディングを取得します。

ここでの問題は、コードがその0x82文字を誤って変換し、UTF-8であると考えていることですが、そうではありません。0x82の値を持つUTF-8「文字」はありません。これが、「不明」/「 」の置換記号を取得する理由です。シングルバイト0x82の文字がないことを示す次のUTF-8テーブルを参照してください。

UTF-8エンコードテーブル

OPで述べたように、問題の列の照合順序はですSQL_Latin1_General_CP1_CI_AS。これは、8ビットエンコーディングがコードページ1252 (Windows Latin 1(ANSI))を使用していることを意味します。そして、そのチャート(文字名があるため、一番下のチャートまでスクロールします)の値0x82(「コードポイント」列で「82」を探します)を確認すると、実際にはSSMSに表示される単一の低9引用符です。その文字は、UTF-8では3バイトのシーケンスですE2 80 9A

この手段のすべてが何であるか:コードページ1252へのSQL Server接続用のクライアントをコードするいずれかのセットにあなたのPythonコードの必要性、またはあなたが/変更する必要が返される文字列のエンコーディングを変換するからコードページ1252 UTF-8。

もちろん、これがWebページに表示されている場合は、ページの宣言された文字セットをに変更できますWindows-1252UTF-8文字が既に存在する場合、ページの他の文字に干渉する可能性があります。


ニース、これはとても役に立ちます。ソロモンに感謝します。誤訳について教えてください。これはかなりトリッキーな問題で、どこから始めればいいのかさえわかりません。
Eric

うわー、驚くべき詳細、@ソロモン!私は別のPython + MS SQL問題を探してここに着陸しましたが、あまりにも多くのことを学んでいたため、読み続けました。:-P
マイクウィリアムソン

1
@MikeWilliamsonその褒め言葉を共有してくれてありがとう:) また、C#.NET md5(SO上)とは異なるTSQL md5ハッシュヘブライ語アクセントマークを削除する方法(ここではDBA.SE)、およびCollat​​ions.Infoにも興味があるかもしれません。楽しい!
ソロモンルツキー

ありがとう!ラテン系以外の言語で作業している人なら誰でも、このことを米国や英国で穏やかに作業している私たちよりはるかによく知っていると思います。:)
マイクウィリアムソン

1
注:MS SQL Server 2019では、VARCHAR / CHARデータ型でUTF-8のネイティブサポートが導入されています。
グレゴリーアレニウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.