使用 sqlx 在 Postgres 中查询 BYTEA

问题描述

我在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...