Postgresql C如何将uint64_t转换为数字?

时间:2018-01-25 16:48:49

标签: c postgresql uint64

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

2 个答案:

答案 0 :(得分:2)

C uint64_tint64_t可以相互推送而不会丢失信息(在二进制补码算术中,但我怀疑你是在使用UNIVAC),所以你可以将所有uint64_t数量投放到int64_t,然后再将其写入数据库,并在阅读时返回uint64_t

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

编辑:我刚刚意识到,通过“数字”你可能意味着PostgreSQL的任意精度NUMERIC列类型。不幸的是,无论如何在文本SQL级别下找到如何使用此类型的文档,我都没有任何运气。我唯一可以建议你阅读用于在C中编写服务器端扩展的头文件和/或在pg邮件列表上寻求帮助。

答案 1 :(得分:1)

我找不到直接处理此转换的现有函数。更糟糕的是,用于构建NUMERIC值的所有结构和函数似乎都是numeric.c的本地值,并且伴随header中没有任何用处,所以我是不确定你自己如何构建它们(看起来我们是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));