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のままで処理を成功させたいのですが、
どうしたらよいでしょうか。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/09/19 13:55:29
  • 終了:2012/09/26 14:00:03

ベストアンサー

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472012/09/19 14:27:12

ポイント50pt

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

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

id:timestep

返事が遅くなってしまいましたが、解決できました。
わかりやすくて大変勉強になりました。

2012/10/16 11:44:52

その他の回答(3件)

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472012/09/19 14:27:12ここでベストアンサー

ポイント50pt

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

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

id:timestep

返事が遅くなってしまいましたが、解決できました。
わかりやすくて大変勉強になりました。

2012/10/16 11:44:52
id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202012/09/19 23:04:01

ポイント50pt

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

id:timestep

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

2012/09/20 11:55:25
id:pigmon88 No.3

pigmon88回答回数501ベストアンサー獲得回数252012/09/20 22:51:57

ポイント50pt

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

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

id:pyopyopyo No.4

pyopyopyo回答回数351ベストアンサー獲得回数862012/09/24 07:19:19

ポイント50pt

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

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

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

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

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