如何以有效的方式通过 PQgetvalue 获取双精度(或字节)数据?
How can I get double(or bytes) data through PQgetvalue in an efficient way?
我创建了一个包含 3 列的 table:int8
、double
和 bytea
。当查询一行数据时,我使用 PQgetvalue 来获取一行中的每一列值。但是 PQgetvalue return 一个 char*,我必须将文本值转换为相应的类型,如 atoi 或 strtod 等。
有没有更高效的获取实际数据的方法,避免每次都转换数据?
鉴于这些功能:
PQgetvalue
:
char *PQgetvalue(const PGresult *res,
int row_number,
int column_number);
#include <string.h>
void *memcpy(void *restrict dest, const void *restrict src, size_t n);
你像这样提取一个double
:
double dest;
memcpy(&dest, PQgetvalue(...), sizeof dest);
将 char *
转换为数字的开销并不大。但是您可以通过将 1 作为最后一个参数调用 PQexecParams
来使用二进制模式。
要检索二进制数据,您必须使用 PQgetlength
和 PQgetisnull
来获取数据的大小和 NULLness。此外,数据将采用数据库服务器使用的二进制格式,因此如果两台机器具有不同的硬件架构(尽管几乎所有地方都使用 IEEE),double
的表示可能会不同。
我创建了一个包含 3 列的 table:int8
、double
和 bytea
。当查询一行数据时,我使用 PQgetvalue 来获取一行中的每一列值。但是 PQgetvalue return 一个 char*,我必须将文本值转换为相应的类型,如 atoi 或 strtod 等。
有没有更高效的获取实际数据的方法,避免每次都转换数据?
鉴于这些功能:
PQgetvalue
:
char *PQgetvalue(const PGresult *res,
int row_number,
int column_number);
#include <string.h>
void *memcpy(void *restrict dest, const void *restrict src, size_t n);
你像这样提取一个double
:
double dest;
memcpy(&dest, PQgetvalue(...), sizeof dest);
将 char *
转换为数字的开销并不大。但是您可以通过将 1 作为最后一个参数调用 PQexecParams
来使用二进制模式。
要检索二进制数据,您必须使用 PQgetlength
和 PQgetisnull
来获取数据的大小和 NULLness。此外,数据将采用数据库服务器使用的二进制格式,因此如果两台机器具有不同的硬件架构(尽管几乎所有地方都使用 IEEE),double
的表示可能会不同。