web-dev-qa-db-ja.com

UTF8エンコーディングの文字には、WIN1252に同等の文字がありません

次の例外が発生しています。

Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "WIN1252"

SQLを介して、またはプログラムでそのような文字を根絶する方法はありますか?
(SQLソリューションを推奨します)。

WIN1252を使用してDBに接続することを考えていましたが、同じ問題が発生します。

31
Monis Iqbal

このメッセージを受け取ったらどうしますか? Postgresにファイルをインポートしますか?開発者が言ったように、それはBOMキャラクターです。これは、WindowsがUTF8エンコーディングで保存されたときにテキストファイルに最初に書き込む文字です-目に見えない、幅0の文字であるため、テキストエディターで開いたときに表示されません。

このファイルをメモ帳などで開いて、ANSIエンコーディングで保存し、追加(または同様の置換)set client_encoding to 'WIN1252'行をファイルに入れます。

7
Tometzky

同様の問題がありましたが、INSERT INTO foo (SELECT * from bar WHERE x=y);を試みる前に、クライアントで\encoding UTF8を使用してエンコードをUTF8に設定することで解決しました。クライアントはWIN1252エンコードを使用していましたが、データベースはUTF8であったため、エラーが発生しました。

詳細については、PostgreSQL wikiの 文字セットサポート (開発ドキュメント)を参照してください。

29
Andy Terra

キャラクターを根絶しないでください、彼らは本物であり、正当な理由で使用されています。代わりに、Win1252を根絶します。

6
MSalters

よく似た問題がありました。 SQL ServerからPostgreSQLデータベースへのリンクサーバーがありました。 openqueryステートメントを使用して選択していたテーブルに含まれていたデータには、Win1252に相当するものがない文字が含まれていました。問題は、接続に使用したシステムDSNエントリ(ODBC Data Source Administrator)の下にある)が、PostgreSQL Unicode(x64)ではなくPostgreSQL ANSI(x64)を使用するように構成されていたことです。 。Unicodeサポートを使用して新しいデータソースを作成し、新しい変更されたリンクサーバーを作成し、openqueryで新しいリンクサーバーを参照すると、問題が解決しました。

2
Maurice M

これは、リトルエンディアン整数としてのバイトシーケンス0xBD、0xBF、0xEFのように見えます。これは、Unicodeバイトオーダーマーク(BOM)文字0xFEFFのUTF8エンコード形式です。

Postgreの通常の動作が何であるかはわかりませんが、BOMは通常、入力ストリームの先頭でのエンコーディング検出にのみ使用され、通常は結果の一部として返されません。

いずれにせよ、あなたの例外は、このコードポイントがWin1252コードページにマッピングを持たないためです。これは、アジアのスクリプトで使用されるような、他のほとんどの非ラテン文字でも発生します。

データベースのエンコーディングを1252ではなくUTF8に変更できますか?これにより、列にほとんどすべての文字を含めることができます。

1
devstuff

Postgresの部分文字列関数を使用し、代わりにそれを選択することで回避できました。

select substring(comments from 1 for 200) from billing

特殊文字が各フィールドを開始したというコメントは、最終的にそれを解決するのに非常に役立ちました。

この問題は、古いAccess 97アプリがpostgresql 9.1 DBにアクセスしていた2016年11月19日頃に発生しました。

これは、ドライバをANSIではなくUNICODEに変更することで解決しました(plangコメントを参照)。

0
Maxime Langlois

ここで私のために働いたものは次のとおりです。1 sp_configureでアドホッククエリを有効にします。 2リンクされたPostgreSQLサーバーにODBC DSNを追加します。3ANSIおよびUnicode(x64)ドライバーの両方があることを確認します(両方で試してください)。 、db name and password。5 postgreSQL形式で最後の行にクエリを保持します。

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

SELECT * FROM OPENROWSET('MSDASQL', 
'Driver=PostgreSQL Unicode(x64); 
uid=loginid;
Server=1.2.3.41;
port=5432;
database=dbname;
pwd=password',

'select * FROM table_name limit 10;')
0
s6a6n6d6m6a6n