Postgresql C 如何将uint64_t转换成数值?

Postgresql C How to convert uint64_t into numeric?

Postgres 不支持 uint64_t ,最大整数类型是 BIGINT,其范围等于 int64。我需要 return 来自 C 函数的 unit64_t var,如何将其转换为数字然后我可以 return 来自我的函数的数字?

C 的 uint64_tint64_t 可以相互转换而不会丢失信息(在二进制补码算法中,但我怀疑你使用的是 UNIVAC),所以你 可以 将所有 uint64_t 个数量转换为 int64_t,然后再将它们写入数据库并在读取时返回 uint64_t

不过还是有一些潜在的问题。首先,如果您需要在相关数据库列中存储实际的负数,不要这样做,因为您无法分辨它们是负数还是大于 2 的数字63−1 当你读回它们时。此外,所有 SQL 操作会将所有大于 263−1 的数字视为负数。这可能是问题,也可能不是问题,具体取决于您使用这些大数字的目的以及涉及它们的查询往往有多复杂。

编辑:我刚刚意识到 "numeric" 您可能指的是 PostgreSQL 的任意精度 NUMERIC 列类型。不幸的是,我没有任何运气找到有关如何在文本 SQL 级别以下使用此类型的文档。我唯一可以建议的是让你阅读用 C 编写服务器端扩展的头文件 and/or 在 pg 邮件列表上寻求帮助。

我找不到直接处理此转换的现有函数。更糟糕的是,所有用于构建 NUMERIC 值的结构和函数似乎都是 numeric.c, and there's not much of any use in the accompanying header, so I'm not sure how you're expected to build them yourself (looks like we are not the first to notice this) 的本地结构和函数。

似乎这基本上将您限制在类型的 SQL 级别 API(即内置类型转换和算术运算)。我认为唯一可以转换为 NUMERIC 并且宽度足以容纳 uint64 的 SQL 类型是 TEXT。换句话说,最简单的方法可能是将您的值转换为字符串,并将其传递给 NUMERIC 解析例程,例如:

char uint64_string [21];
sprintf(uint64_string, "%" PRIu64, uint64_val);
PG_RETURN_DATUM(DirectFunctionCall3(numeric_in, CStringGetDatum(uint64_string), 0, -1));