PostgreSQL 7.4.13 以降、異なるエンコーディングでの変換エラー
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 のコード変換を使用しないのでエラーは起こらなくなる。可能なら、これが一番よさそうだ。