PostgreSQLエラー「ERROR: invalid byte sequence for encoding "EUC_JP": 0xe590」の原因と解決方法
Linux、Solaris等のコンソールよりpsqlでPostgreSQLデータベースに接続後、コマンドを実行しようとすると、
ERROR: invalid byte sequence for encoding "EUC_JP": 0xe590
といったエラーになり、コマンドが実行できない場合がある。
《例》
-bash-3.00# psql -U postgres
PostgreSQL の会話型ターミナル、psql 8.1.17 (サーバ 8.3.13)へようこそ
\copyright とタイプすると、配布条件を表示します。
\h とタイプすると、SQL コマンドのヘルプを表示します。
\? とタイプすると、psql コマンドのヘルプを表示します。
\g と打つかセミコロンで閉じると、クエリーを実行します。
\q で終了します。
警告: 現在接続中のサーバはメジャーバージョン 8.3 ですが、使用中の
クライアント psql のメジャーバージョンは 8.1 です。\d をはじめとする
いくつかのバックスラッシュコマンドは正常に動作しない場合があります。
postgres=# \l
ERROR: invalid byte sequence for encoding "EUC_JP": 0xe590
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
postgres=# \q
サーバのエンコーディングの問題のようなので、localeコマンドを実行して確認すると、データベースのエンコーディング「EUC_JP」とは異なる「UTF-8」になっていた。
《例》
-bash-3.00# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=
環境変数LANGをデータベースと同じEUC_JPに設定してみる。
《例》
-bash-3.00# export LANG=ja_JP.eucJP
localeコマンドを実行し、EUC_JPになっていることを確認する。
《例》
-bash-3.00# locale
LANG=ja_JP.eucJP
LC_CTYPE="ja_JP.eucJP"
LC_NUMERIC="ja_JP.eucJP"
LC_TIME="ja_JP.eucJP"
LC_COLLATE="ja_JP.eucJP"
LC_MONETARY="ja_JP.eucJP"
LC_MESSAGES="ja_JP.eucJP"
LC_ALL=
psqlコマンドを実行してPostgreSQLデータベースに接続し、正常にコマンドが実行されることを確認する。
《例》
-bash-3.00# psql -U postgres
PostgreSQL の会話型ターミナル、psql 8.1.17 (サーバ 8.3.13)へようこそ
\copyright とタイプすると、配布条件を表示します。
\h とタイプすると、SQL コマンドのヘルプを表示します。
\? とタイプすると、psql コマンドのヘルプを表示します。
\g と打つかセミコロンで閉じると、クエリーを実行します。
\q で終了します。
警告: 現在接続中のサーバはメジャーバージョン 8.3 ですが、使用中の
クライアント psql のメジャーバージョンは 8.1 です。\d をはじめとする
いくつかのバックスラッシュコマンドは正常に動作しない場合があります。
postgres=# \l
データベース一覧
名前 | 所有者 | エンコーディング
-------------+----------+------------------
nobuneko_db | postgres | EUC_JP
postgres | postgres | EUC_JP
template0 | postgres | EUC_JP
template1 | postgres | EUC_JP
(4 行)
「ERROR: invalid byte sequence for encoding "EUC_JP": 0xe590」といったエラーが出た場合は、サーバの環境変数LANGをデータベースと一致させることで解決するかもしれない、と思った。
※「export LANG=ja_JP.eucJP」で環境変数LANGをEUC_JPに変更しても、サーバを再起動したり、SSHコマンドでリモート接続をやり直したりした時には、また元の設定(上記例ではUTF-8)に戻るので注意が必要。
※postgresql.confのclient_encodingでも設定できるのかもしれないが、うまくいかなかったので、そちらについては、今度時間があればやってみたい。