リウムのふじたです。

バージョンが上がる毎に目覚しい高速化が図られているPostgreSQLというリレーショナルデータベースがあります。

新規にアプリケーションを開発する場合は、なるべく新しいものをチョイスすれば良いと思いますが、既に存在するアプリケーションが使用しているPostgreSQLのバージョンアップをする場合、得られる変化はその速度だけでなく互換性の問題が発生する場合もあります。

今回はバージョン8.1系から、8.4系へバージョンアップした場合に起こる問題の一例です。


PostgreSQLは、バージョン8.3以降、暗黙の型変換がなくなり厳密化されたことにより、こんなエラーメッセージが出力されることもあります。

ERROR:  operator does not exist: integer = text
HINT:  No operator matches the given name and argument type(s).
       You might need to add explicit type casts.

これは整数型と文字列型と型が異なるフィールド同士を条件文などで比較したりした場合に起こるようです。

きっちり設計、作成されていれば、こういう型違いは起こらないのですが…。

一つ一つ型を合わせてテーブルを設計し直すか、キャストを入れていけばエラーは修正できますが、影響が広範囲であった場合、なかなか難しい事もあると思います。

その場合、下記のキャストを定義すれば、アプリケーション側に手を入れずに、エラーを無くすことができます。


CREATE CAST (int4 AS text) WITH INOUT AS IMPLICIT;
※PostgreSQL バージョン8.4以降


ただ、型違いのままだと、インデックスが効かないと思いますので、可能であれば型を合わせて、組み直した方がよろしいかと思います。

こちらにもっと詳しい解説が書かれています。