我使用libpq-fe
中的C
库与postgres数据库联系
我使用libpqfe
从我的代码调用存储过程,它返回一个时间戳
我想将此时间戳存储到char数组中。但要这样做,我首先必须知道时间戳的大小,以便我可以声明数组。要获得我使用int PQfsize(PGresult *res, int field_index);
的大小。您可以找到更多相关信息here。
返回值8
。但实际上时间戳(没有区域)的大小是19
。
为什么PQfsize返回错误的值?
我知道时间戳的大小是常量,我可以直接声明一个数组,然后使用PQgetvalue
检索该值,但是如何为没有固定大小的字段声明数组。
如何从PGresult
检索字段以将其存储到任何变量中?
答案 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
字节,而不是你正在寻找的人类可读字符串。
您可能希望将PQExecParams
与resultFormat
设置为零来获取结果中的文本值而不是二进制文本值。如果你这样做,你应该得到你期望的timestamp
的字符串表示,但你必须做一点点的字符串解析,将PGresult
的内容转换为本机类型