Postgres不支持uint64_t,最大的整数类型是BIGINT,其范围等于int64。我需要从C函数返回一个unit64_t var,如何将其转换为数字然后我可以从我的函数返回一个数字?
答案 0 :(得分:2)
C uint64_t
和int64_t
可以相互推送而不会丢失信息(在二进制补码算术中,但我怀疑你是在使用UNIVAC),所以你可以将所有uint64_t
数量投放到int64_t
,然后再将其写入数据库,并在阅读时返回uint64_t
。
答案 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));