postgresqlの質問です。


UNICODEで初期化したDBに格納されているデータをdumpしたUNICODEのデータがあります。
これをEUCで初期化されたDBに復元したいのですが、
どのような方法があるでしょうか?

OS:Vine3.2
postgresql7.1.9

以上、宜しくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/04/15 16:38:37
  • 終了:2007/04/16 20:41:47

回答(2件)

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472007/04/15 19:37:30

ポイント50pt

「dump」とおっしゃっているのが「pg_dump」で得られたものであれば、データベース上でどの文字コードで保存しているかは、関係ありません。

その dump したファイルの中身を見れば、たぶん、

SET CLIENT_ENCODING ~

という行があると思います。pg_dump を実行した時のクライアント側の文字コードでファイルが作られているはずです。

サーバ側の文字コードとクライアント側の文字コードは、自動的に変換されます。pg_dump で得られる結果の文字コードはクライアント側の文字コードになっているので、サーバ側の文字コードを意識する必要はありません。

それより、PostgreSQL のバージョンがすごく古いのが気になりますが...

id:masashi0316

pg_dumpで得られるものです。

また、確かにファイル冒頭に

SET client_encoding = 'UNICODE';

とあります。

以下の作業をするとエラーになり困っています。

1.pg_dump [DbName] > [BackUpFileName]を実施。

2.1.で得られたファイルを復元側のサーバに配置。

3.復元側サーバでcreatedb [DbName]を実施。

4.psql -e -f [BackUpFileName] [DbName]

ここで、

COPY [TableName]・・・の後に

ERROR: ignoring unconvertible EUC_JP character 0xe382

と表示され、[TableName]のデータが取り込めません。

解決方法をご教授いただければ幸いです。

#バージョンは確かに古いですね、

#テスト環境のため怠慢してました^^

2007/04/16 20:12:44
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/04/15 22:26:07

ポイント50pt

いまだにそんな古いバージョンが残っていたのか…。

もうサポートも無いし、早めにバージョンアップを検討したほうがいいですよ。


ダンプしたデータの先頭に、

SET CLIENT_ENCODING 'UNICODE';

か、psql でレストアする場合は

\encoding UNICODE

と記述しておけば自動的にコードが変換されて格納されます。


ただし、当然ですが PostgreSQL が対応していない文字については変換しきれない可能性はあります。

そのばあいワーニングがでるので判別は容易ですが。

id:masashi0316

>PostgreSQL が対応していない文字については変換しきれない可能性はあります

これですかねぇ。

\encoding UNICODE

も記述してみましたがだめでした。

それと、一つ書き忘れてましたが、

復元側のサーバでDBを作成する際、

createdb -E UNICODE [DbName]としてやると

うまく取り込めます。

でも、ちょっと理由があって、EUCの文字コードで作成されたDBに格納する必要があります。

2007/04/16 20:34:13
  • id:masashi0316
    すみません、解決したので、質問終了させていただきました。
    解決方法は、ちょっと正当ではないのかもしれませんが、

    nkfでファイルの文字コードをEUCに変換して、
    ファイル冒頭のSET client_encoding = 'UNICODE';を
    SET client_encoding = 'EUC';に変更。

    これで、うまくいきました。
    ありがとうございました。
  • id:b-wind
    >nkfでファイルの文字コードをEUCに変換して、
    >ファイル冒頭のSET client_encoding = 'UNICODE';を
    >SET client_encoding = 'EUC';に変更。

    それってたぶん PostgreSQL ではエラーだった文字が他の文字に置き換えられてるだけだと思うけど、いいのですか?
  • id:masashi0316
    PostgreSQLで変換できなかった文字はnkfでも同様の可能性があるということですね。。とりあえず、データ量はわずかなので目視で確認してみるしかないか、というとこです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません