web-dev-qa-db-ja.com

WindowsとLinux間のエンコーディングとpg_dump / restoreに関する問題

WIN1252でエンコードされたpg_dumpを使用して作成したdmpファイルがあります。私がやりたいのは、pg_restoreを使用してLinuxマシンのデータベースにインポートすることです。問題は、WindowsマシンでpostgreSQLがWIN1252エンコーディングを認識しますが、CP1252エンコーディングを認識しないことです(どちらも同じ規格の異なる名前であり、まったく同じです)。 Linuxマシンでは、postgreSQLはCP1252を認識しますが、WIN1252は認識しません。したがって、pg_restoreを実行しようとすると、WIN1252が適切なエンコーディングとして認識されないため、エラーが発生します。また、Windowsでpg_dumpを実行し、エンコーディングをCP1252として指定しようとすると、同様のエラーが発生します。私はこのエンコーディング形式を使い続けたいので、utf8でpg_dumpを実行することは、私がやりたいことではありません。何か助けていただければ幸いです!

編集:実際には、さらに調査したところ、postgreSQLはcp1252を理解していません。テキストファイルをあるエンコーディングから別のエンコーディングに変換するために使用されるiconv linuxコマンドは、win1252ではなくcp1252を理解し、それを取得しました。 Linuxマシンでは、クライアントのエンコーディングをWIN1252に設定できません。これはエラーメッセージです。

FATAL:  conversion between WIN1252 and LATIN1 is not supported

変数client_encodingは、LinuxマシンではもともとUTF8に設定されていたため、LATIN1がどこから来ているのかわかりません。 WIN1252がサポートされていない限り、postgresはそれをlatin1に変換しようとします。これは、それに最も近いものであり、一部の文字のミスマッチのためにそれを達成できないためですか?

4
user972276

あなたが持っているダンプファイルはWIN1252でエンコードされており、LinuxのターゲットデータベースはサーバーのエンコードとしてLATIN1を持っていると思います。エラーメッセージが言うように、それはうまくいきません。

UTF8を使用してターゲットデータベースを再初期化することをお勧めします。

または、pg_dump -Eオプションを使用して、UTF8でダンプを作成します。

4

解決策は、「iconv」ユーティリティを使用することです。 cat dump.sql | iconv | psql。これは通常、エンコーディングをクリーンアップします。

参照: http://www.documentroot.com/2013/12/utf8-encoding-and-postgres-dump.html

0
Erik Aronesty