web-dev-qa-db-ja.com

SQL Serverに照合順序をUTF-8 / UTF-16に変換させることは可能ですか?

私が取り組んでいるプロジェクトでは、データはSQL Serverに格納され、照合順序はDanish_Norwegian_CI_AS。データは、FreeTDSおよびODBCを介して、pythonに出力されます。これは、データをUTF-8として処理します。å、ø、æなどの一部の文字は、正しくコーディングされていないため、 Grindへのプロジェクトの進行は停止します。

エンコード、照合、コードページの混乱する世界について数時間読んで、全体像をよりよく理解したように感じました。

私が読んだ記事のいくつかは、次のことが可能になると考えさせてくれます。SQL selectステートメントで、出力時に照合データをUTF-8にエンコードすることを指定します。

これが可能だと思っている理由は この記事 です。これは、異なる照合順序でテーブルにアクセスして、ニースを一緒にプレイする方法の例を示しています。

照合をUTF-8/UTF-16に変換する方向のポインターは大歓迎です!

編集:私はSQL Serverがncharnvarcharおよびntextを介してユニコードオプションを提供し、他の文字列変数charvarcharおよびtextは、設定された照合に従ってコーディングされます。また、上記のユニコードオプションがutf-16バリアントucs-2でコーディングされていることも読みました(その権利を思い出すことを望みます)。そう;ロケール照合とUnicodeのテーブルを許可するために、ニースを再生するには、変換関数が必要です。

11
Rookie

4か月後、ようやく問題の答えが見つかりました。 FreeTDSドライバー、またはデータベース照合とは何の関係もないことがわかりました。

Pyodbcの接続関数であり、明らかにフラグが必要です。 unicode_results=True

手がかりを探して暗闇の中であてもなくさまよう運命にある他の不幸な魂を助けるためにここに投稿されました。

12
Rookie

SQLはUTF-8をサポートしていないようです( here を参照)が、selectの照合順序を次のように変更してみることができます。

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS
from Data

このソリューションを使用してアクセントを取り除くこともできます: sql-serverでアクセントとすべての文字を削除する方法<> a..z?

別の解決策は、列をnvarcharにキャストすることです

SELECT cast (Account as nvarchar) as NewAccount 
from Data

ここで、アカウントは初期テーブルのvarcharです。

たとえば、あなたがしようとする場合:

SELECT cast(cast(N'ţ' as varchar) as nvarchar)

最終結果は「ţ」になります

3
sbiz