PostgreSQL 9.1 に対して CF9.0 と 10 の両方でクエリをテストしたcf_sql_other
ところ、型は問題なく動作しました。したがって、それはエラーの原因となっている実際のクエリではないか、または目に見える以上のことが起こっている可能性があります。DSN に特別な jdbc 接続設定がありますか?
ERROR: operator does not exist: uuid = character varying
Postgres で UUID 列をマップするためにここで使用する ColdFusion の cf_sql タイプはどれですか?
私の限られたテストといくつかの簡単な検索に基づくとcf_sql_other
、CF9+ にバンドルされている PostgreSQL ドライバーで使用する正しいタイプです。jdbc 3 には PostgreSQL のuuid
型に相当するものはありません。そのため、型OTHER
はデータベース固有であることを示すために使用され、ドライバ内部はそこから取得します。
のような文字列タイプのいずれかを使用するcf_sql_varchar
か、省略してエラーを再現できたcfsqltype
ので、デフォルトはcf_sql_char
. エラー メッセージが表示されるため、uuid と文字列の直接比較はサポートされていません。最初に uuid を明示的に文字列にキャストする必要があります (またはその逆)。以下の例はすべて、CF9+ と PostgreSQL 9.1 で機能しました。
<!--- uuid = "d0c2b125-9222-d479-fb4a-be912b8c7c3b" --->
<!--- syntax 1 ---->
WHERE CAST(sess_uuid AS VARCHAR) = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">
<!--- syntax 2 ---->
WHERE sess_uuid::text = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">
<!--- syntax 3 --->
WHERE sess_uuid = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">::uuid
お勧めしませんが、cfqueryparam を省略しても機能することは注目に値します。値との直接比較varchar
は (postgresql でも) 失敗するので、この 1 つのケースでは追加の変換マジックが発生していると思います。
<!--- fails --->
WHERE sess_uuid = CAST('#uuid#' AS VARCHAR)
<!--- works --->
WHERE sess_uuid = '#uuid#'