0

UTF8文字セットを使用し、Linuxで実行されているPostgresのデータウェアハウスから、標準のPostgres ODBCドライバーを介して、典型的なWindows文字セットを使用してSQLServerにデータをコピーするETLの一部を開発しています。

ソース データの一部に、ターゲット文字セットに変換できない UTF8 文字が含まれていることがわかりました。これにより、ロード全体が失敗します。

データベースから出力されるデータを変換するために使用できる postgres 関数はありますか? この問題に対処する他の方法はありますか?

PS ところで、1 つのテーブルのデータ フローでこのエラーが発生すると、すべてのロードが失敗するのはなぜですか?

4

2 に答える 2

1

ここでいくつかの仮定を立てています。

  1. ODBC システム DSN 経由で MS SQL リンク オブジェクトを使用して Postgress に接続しようとすると、「エラー: エンコーディング "UTF8" の文字 0xc280 は "WIN1252" に相当するものはありません。
  2. 一部のテーブルの Select ステートメントは機能し、他のテーブルはこのエラーをスローします。

修正: Unicode をサポートする ODBC ドライバーを使用します。PostgreSQL Global Development Group の ODBC ドライバーを使用しています。DSN の構成/DSN の管理に移動し、Unicode ドライバーを選択します。

画像を投稿しようとしましたが、システムが受け入れません。投稿するには 10 の「評判」が必要なようです。

幸運を。

マドゥ

于 2013-10-04T20:02:48.950 に答える
1

ターゲットのエンコーディングでサポートされていない UTF-8 でエンコードされた文字がある場合、PostgreSQL にはデータを破壊せずに文字を変換する方法がありません。データを破壊しないため、エラーが報告されます。

regress=# CREATE TABLE encoding_test(data text);
CREATE TABLE
regress=# INSERT INTO encoding_test(data) VALUES ('退休慰問金省182億怎麼用? 藍中常委建議發消費券');
INSERT 0 1
regress=# SHOW client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)

regress=# SET client_encoding = 'Windows-1252';
SET
regress=# SELECT * FROM encoding_test ;
ERROR:  character 0xe98080 of encoding "UTF8" has no equivalent in "WIN1252"

それがすべての動作を停止させる理由については、Pg がエラーを発生させると、トランザクションが中止されます。同じトランザクション内の将来のステートメントは失敗します。データの整合性を維持することが重要であり、トランザクション内で 1 つの操作が失敗するとトランザクション全体が失敗するため、これは仕様によるものです。これにより、誰かがテーブルを復元してから、「なぜ、この 1 つのテーブルが空なのか?」と尋ねるまで、エラーに気付かない可能性が低くなります。

ここですべきことは、PostgreSQL Unicode ODBC ドライバーを使用するか、ANSI ODBC ドライバーを utf-8 と共に使用してからclient_encoding、データを SQL Server に Unicode として挿入し、DB が Unicode を受け入れるように適切に設定されていることです。

実際にデータを Windows 8 ビット コードページの 1 つに変換して破棄したい場合: PostgreSQL には、変換できない文字をプレースホルダーで置き換える変換モードがありません。これは、意図的にデータを破棄たい場合にイライラすることがあります。PostgreSQL 接続を UTF-8 モードにするか、(Windows では) Unicode ODBC ドライバーを使用してから、アプリケーションで文字列を Unicode から目的のターゲット エンコーディングに変換し、必要に応じて変更することをお勧めします。

于 2012-10-24T23:32:42.000 に答える