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のままで処理を成功させたいのですが、
どうしたらよいでしょうか。
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
という行を加える方法の方が良いと思います。
DBの中身がEUCとはどのような意味でしょうか。
データは何も入れていない状態です。