关于DOMAINS的讨论很有趣,但与该问题的唯一可能来源无关。对无符号整数的需求是将相同位数的整数范围加倍,这是一个效率参数,而不是排除负数的需求,每个人都知道如何添加检查约束。
当有人问到它时,Tome Lane说:
基本上,除非您能找到一种使它们适合数字促销层次结构且不会破坏许多现有应用程序的方法,否则这种情况发生的可能性为零。如果内存可用,我们已经不止一次地进行了研究,并且未能提出一种似乎没有违反POLA的可行设计。
什么是“ POLA”?Google给了我10条毫无意义的结果。不知道这是否是政治错误的想法,因此受到审查。为什么这个搜索词不会产生任何结果?随你。
您可以将无符号的int实现为扩展类型,而不会带来太多麻烦。如果使用C函数执行此操作,则几乎不会有任何性能损失。您不需要扩展解析器来处理文字,因为PgSQL具有将字符串解释为文字的简单方法,只需将“ 4294966272” :: uint4编写为文字即可。演员阵容也不是什么大问题。您甚至不需要做范围例外,您可以将'4294966273':: uint4 :: int的语义视为-1024。或者您可以抛出一个错误。
如果我想要这个,我会做的。但是由于我在SQL的另一端使用Java,因此对我来说意义不大,因为Java也没有这些无符号整数。所以我一无所获。如果我从bigint列中获取BigInteger,而现在它应该很长,我已经很烦。
另一件事,如果我确实需要存储32位或64位类型,则可以分别使用PostgreSQL int4或int8,只是要记住自然顺序或算术运算不能可靠地起作用。但是存储和检索不受此影响。
这是我可以实现一个简单的无符号int8的方法:
首先,我将使用
CREATE TYPE name (
INPUT = uint8_in,
OUTPUT = uint8_out
[, RECEIVE = uint8_receive ]
[, SEND = uint8_send ]
[, ANALYZE = uint8_analyze ]
, INTERNALLENGTH = 8
, PASSEDBYVALUE ]
, ALIGNMENT = 8
, STORAGE = plain
, CATEGORY = N
, PREFERRED = false
, DEFAULT = null
)
最少的两个功能uint8_in
,uint8_out
我必须先定义。
CREATE FUNCTION uint8_in(cstring)
RETURNS uint8
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION uint64_out(complex)
RETURNS cstring
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
需要在C uint8_funcs.c中实现。因此,我从这里开始使用复杂的示例,并使其变得简单:
PG_FUNCTION_INFO_V1(complex_in);
Datum complex_in(PG_FUNCTION_ARGS) {
char *str = PG_GETARG_CSTRING(0);
uint64_t result;
if(sscanf(str, "%llx" , &result) != 1)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for uint8: \"%s\"", str)));
return (Datum)SET_8_BYTES(result);
}
嗯,或者您可以发现它已经完成。