问题描述
我在 Postgres 数据库中有下表:
CREATE TABLE resources_index (
hash varchar NOT NULL,"name" varchar NOT NULL,viewentry_id varchar NOT NULL,value bytea NULL
);
我想使用 sqlx
执行以下准备好的语句:
SELECT
t0.name,t0.value
FROM
(
SELECT
name,value
FROM
resources_index
WHERE
hash = $1
AND value :: BYTEA LIKE $2 :: BYTEA
) AS t0
LIMIT
$3
问题出现在以下行中:
AND value :: BYTEA LIKE $2 :: BYTEA
Postgres DB 错误响应是:
ERROR: operator does not exist: character varying = bytea
查询执行如下:
let mut q = sqlx::query_as::<sqlx::Postgres,IndexRow>(&query);
for v in values.iter() {
log::debug!("bind value {}",v);
q = q.bind(v.as_bytes());
}
q.bind(limit).fetch_all(pool).await
对我来说,v
被强制转换为 VARCHAR
,但它应该是 BYTEA
。
解决方法
使用内置的 decode 函数解决了这个问题。
SELECT
t0.name,t0.value
FROM
(
SELECT
name,value
FROM
resources_index
WHERE
hash = $1
AND value LIKE decode($2,'escape')
) AS t0
LIMIT
$3