PostgreSQL 7.4.13 以降、異なるエンコーディングでの変換エラー

2007/12/10 9:54am

PostgreSQL 7.4.18 で以下のようなエラーが出力されるようになった。

ERROR:  22P05: character 0xe28094 of encoding "UNICODE" has no equivalent in "EUC_JP"

PostgreSQL の JDBC ドライバはバックエンド (PostgreSQL) のバージョンが 7.3 以降の場合、接続時に必ず set client_encoding = "UNICODE" を発行する。

以下は org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java の 509 行目から抜粋。

if (haveMinimumServerVersion("7.3"))
{
  BaseResultSet acRset =
  //TODO: if protocol V3 we can set the client encoding in startup
  execSQL("set client_encoding = 'UNICODE'");
  //set encoding to be unicode
  encoding = Encoding.getEncoding("UNICODE", null);

}

また、PostgreSQL 7.4.13 からは変換できないバイト列をすべてエラー扱いするようになった。

そのため、データベース側のエンコーディングに UNICODE (UTF-8) 以外を使用している場合(ここではエラーからも分かるように、EUC-JP にしていた)、往々にしてこのエラーが起こるようだ。

回避策としては、データベース側のエンコーディングも UNICODE (UTF-8) にしてしまえば、PostgreSQL のコード変換を使用しないのでエラーは起こらなくなる。可能なら、これが一番よさそうだ。