人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

postgresqlで文字エンコーディングの設定について

SQL文の書かれたファイルを実行すると
ERROR: invalid byte sequence for encoding "UTF8": 0xbb
というようなエラーが出ます。


エラーが出るまでの手順
環境MacOS10.6

initdb /usr/local/var/postgres --encoding=EUC_JP --no-locale
でEUCの設定ができるように初期化

createdb -E EUC_JP sampledb
でEUCの設定でDB作成

create文とinsert文が書かれたSQLファイル(文字コードはEUC)
を実行すると最初に書いたエラーが出てくる

psql -l で該当のDBのEncodingを見ると EUCになっている

psqlユーティリティで該当のDBに入って
show client_encoding;すると、なぜかUTF8が表示される

set client_encoding TO "EUC_JP";してから
show client_encoding;するとEUCになる。

しかしpsqlからexitしてまた入り直すとUTF8に戻っている。

しょうがないのでファイルの文字コードをUTF8に変えて実行するとうまくいった。

手順は以上です。

ファイルの文字コードをEUCのままで処理を成功させたいのですが、
どうしたらよいでしょうか。

●質問者: timestep
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● JULY
●50ポイント ベストアンサー

initdb で指定したものや psql -l で表示される物は、サーバ側が個々の DB の文字コードがどうなっているのかを示すもので、psql が読み込む SQL 文の文字コードをどうするかは、client_encoding の設定になります。サーバ側の文字コードとクライアント側での文字コードは、自動的に変換されるので、DB の文字コードが EUC-JP だからといって、psql で実行するする SQL 文が EUC-JP である必要はありません。

なので、一つの手は、SQL のファイルを UTF-8 に変換してしまう方法です。お使いの環境は、デフォルトでは UTF-8 の環境なのですから、特に指定をしなければ、psql は入力される SQL 文が UTF-8 であると仮定します。

余談:
今回の場合は、元が EUC-JP のファイルなので大丈夫だと思いますが、基本的には UTF-8 の方が扱える文字の数が多いので、UTF-8 にあって EUC-JP にない文字がある場合、サーバ側の文字コードを EUC-JP にしていると、「そもそも入らない文字がある」という状態が発生します。なので、特別な事情が無ければ、initdb 時は UTF-8 にしておいて、クライアント側の文字コードを都合に合わせて指定する方が安全です。

閑話休題。

もう一つは、クライアント側の文字コードを EUC-JP にする方法ですが、これにはいくつかあります。

set client_encoding や、「\encoding」などは、あくまでも一時的に入力を切り替える方法なので、psql を終了してしまえば元に戻ります。これを恒久的に変更するには .psqlrc というファイルを作って、設定を記述する方があります。

Postgresql (psql) .psqlrc tips and tricks
上記のページに .psqlrc の設定例がありますが、この中で、

\encoding unicode

というのが出ています。こんな感じで(といっても、「\encoding」以外の行は不要だと思いますが)、EUC-JP を指定する事は可能です。

ただ、こうしてしまうと、psql が常に EUC-JP 扱いする事になるので、あまり好ましくありません。

なので、読み込ませる SQL ファイルの先頭に

\encoding EUC-JP

という行を加える方法の方が良いと思います。


timestepさんのコメント
返事が遅くなってしまいましたが、解決できました。 わかりやすくて大変勉強になりました。

2 ● oil999
●50ポイント

問題はBOMありUTF-8のBOMコード(0xBBを含む)ではないかと思います。
SQL文はEUC-JPで作成されていますか? ご確認ください。


timestepさんのコメント
SQL文はEUCで作成しています。 これをUTFに変換したときにはエラーが出なくなります。 EUCのままエラーを出さないようにしたい、ということです

3 ● pigmon88
●50ポイント

ここを参考に。コマンドが間違ってないですか?

http://ash.jp/db/pg_tips.htm


4 ● pyopyopyo
●50ポイント

psql を起動する環境が UTF-8 になっている為だと思います.

$ export LANG=ja_JP.euc-JP
$ psql

と最初に 環境変数LANGを euc に切り替えてから psql を起動すると解決しませんか?

http://kaiunix.cs.shinshu-u.ac.jp/Lesson/DataBase/2011/japanese.html

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ