在libpq-fe中获取字段大小

时间:2012-12-27 15:16:41

标签: c postgresql libpq

我使用libpq-fe中的C库与postgres数据库联系 我使用libpqfe从我的代码调用存储过程,它返回一个时间戳 我想将此时间戳存储到char数组中。但要这样做,我首先必须知道时间戳的大小,以便我可以声明数组。要获得我使用int PQfsize(PGresult *res, int field_index);的大小。您可以找到更多相关信息here

返回值8。但实际上时间戳(没有区域)的大小是19

为什么PQfsize返回错误的值?

我知道时间戳的大小是常量,我可以直接声明一个数组,然后使用PQgetvalue检索该值,但是如何为没有固定大小的字段声明数组。

如何从PGresult检索字段以将其存储到任何变量中?

2 个答案:

答案 0 :(得分:3)

PQfsize没有返回错误的值。

如果你运行下面的查询,你也会得到答案8,因为你的Postgres时间戳版本内部存储为8字节(64位)整数。

select typlen from pg_type where oid = 'timestamp'::regtype::oid;

根据您链接的文档,PQfsize返回在数据库元组中为此字段分配的空间,换句话说,返回数据类型的服务器二进制表示的大小。

PQgetlength以字节为单位返回字段(属性)的长度。元组和字段索引从0开始。

这是特定数据值的实际数据长度,即PQgetvalue指向的对象的大小。请注意,对于ASCII表示的值,此大小与PQfsize报告的二进制大小几乎没有关系。

为了声明没有固定大小的数组,在使用PQgetlength(应该返回19)创建数组之前,使用数组的大小,并通过指定{{}来获取数据作为文本1}}将PQexecParams设为0.如果您只是使用resultFormat,则默认情况下会以文本形式返回数据。

使用libpq的一个例子是可用的here

要修改此示例,以便只打印该值,它会根据数据的长度创建一个字符数组,并将数据复制到可以用

之类的东西替换for循环的数组中。
PQexec

您还需要在示例中添加 for (i = 0; i < PQntuples(res); i++) { int length = PQgetlength(res, i, 0); char result[length]; printf("%s\n", PQgetvalue(res, i, 0)); strncpy (result,PQgetvalue(res, i, 0),length); }

答案 1 :(得分:1)

来自fine manual

  

PQfsize返回在数据库行中为此列分配的空间,换句话说,返回服务器内部数据类型表示的大小。

因此PQfsize返回服务器内部二进制表示timestamp中的字节数。

timestamp的存储大小为8个字节。基本上,你得到服务器的内部timestamp字节,而不是你正在寻找的人类可读字符串。

您可能希望将PQExecParamsresultFormat设置为零来获取结果中的文本值而不是二进制文本值。如果你这样做,你应该得到你期望的timestamp的字符串表示,但你必须做一点点的字符串解析,将PGresult的内容转换为本机类型