ターゲットのエンコーディングでサポートされていない 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 から目的のターゲット エンコーディングに変換し、必要に応じて変更することをお勧めします。