【问题标题】:PostgreSQL - libpq - bytea and PQexecParamsPostgreSQL - libpq - bytea 和 PQexecParams
【发布时间】:2020-11-28 15:55:38
【问题描述】:

在我的 C++ 代码中,我将 libpq 用于 PostgreSQL。

如果我直接使用PQexec 运行以下查询,我会得到正确的结果(1 | {{15,20},{78,96}})

WITH bar AS(
  SELECT ST_FromGDALRaster(E'\\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082'::bytea) AS rast     
)
SELECT (ST_DumpValues(rast)).*
FROM bar

WITH bar AS(
  SELECT ST_FromGDALRaster('\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082'::bytea) AS rast       
)
SELECT (ST_DumpValues(rast)).*
FROM bar

但是,当我这样做时:

const char* paramValues[1];
int         paramLengths[1];
int         paramFormats[1];

const char * q = R"(        
  WITH bar AS (
     SELECT ST_FromGDALRaster($1::bytea) AS rast        
  )
  SELECT (ST_DumpValues(rast)).*
  FROM bar      
)";

paramValues[0] = "\\x89504e470d0a1a0a0000000d494844520000000200000002080000000057dd52f80000000e49444154089963e46765b11702000107006b50183daf0000000049454e44ae426082";
paramLengths[0] = 72;
paramFormats[0] = 1;   /* parameters are passed in a binary format */

PGresult* res = PQexecParams(conn,
    q,
    1,            /* one param */
    NULL,         /* let the backend deduce param type */
    paramValues,
    paramLengths,
    paramFormats,
    1);           /* ask for binary results */

auto r1 = PQgetvalue(res, 0, 0);
auto r2 = PQgetvalue(res, 0, 0);

r1r2nullptr,查询本身不会返回错误。

如果我将 paramValues[0] 从十六进制值转换为“字节数组”,我会得到以字符 ‰PNG 开头的数据。在这种情况下,结果不是nullptr,而是空字符串,也不正确。

知道这段代码有什么问题吗?

【问题讨论】:

    标签: c postgresql psql


    【解决方案1】:

    问题是返回结果类型的类型

    PGresult* res = PQexecParams(conn,
        q,
        1,            /* one param */
        NULL,         /* let the backend deduce param type */
        paramValues,
        paramLengths,
        paramFormats,
        0);  /* ask for text results */
    

    结果应该是text (0) 而不是binary (1)

    使用字节数组作为输入,不使用转义符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2013-03-02
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多