[英]PostgreSQL - libpq - bytea and PQexecParams
在我的 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);
值r1
和r2
为nullptr
,查询本身不返回错误。
如果我将paramValues[0]
从十六进制值转换为“字节数组”,我会得到以 chars ‰PNG
开头的数据。 在这种情况下,结果不是nullptr
,而是空字符串,这也是不正确的。
知道这段代码有什么问题吗?
问题是返回结果类型的类型
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)
。
作为输入,使用没有转义符号的字节数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.