Das Gespräch über DOMAINS ist interessant, aber nicht relevant für den einzig möglichen Ursprung dieser Frage. Der Wunsch nach Ints ohne Vorzeichen besteht darin, den Bereich der Ints mit der gleichen Anzahl von Bits zu verdoppeln. Dies ist ein Effizienzargument und nicht der Wunsch, negative Zahlen auszuschließen. Jeder weiß, wie man eine Prüfbedingung hinzufügt.
Auf die Frage von jemandem sagte Tome Lane:
Grundsätzlich besteht keine Chance, dass dies passiert, es sei denn, Sie finden eine Möglichkeit, sie in die numerische Promotion-Hierarchie einzufügen, die nicht viele vorhandene Anwendungen beschädigt. Wir haben uns das mehr als einmal angesehen, wenn der Speicher dient, und es ist uns nicht gelungen, ein funktionsfähiges Design zu entwickeln, das die POLA nicht zu verletzen schien.
Was ist die "POLA"? Google hat mir 10 Ergebnisse gegeben, die bedeutungslos sind . Ich bin mir nicht sicher, ob es politisch falsch gedacht und daher zensiert ist. Warum sollte dieser Suchbegriff kein Ergebnis liefern? Was auch immer.
Sie können vorzeichenlose Ints als Erweiterungstypen ohne allzu große Probleme implementieren. Wenn Sie dies mit C-Funktionen tun, gibt es überhaupt keine Leistungseinbußen. Sie müssen den Parser nicht erweitern, um mit Literalen umzugehen, da PgSQL eine so einfache Möglichkeit bietet, Zeichenfolgen als Literale zu interpretieren. Schreiben Sie einfach '4294966272' :: uint4 als Ihre Literale. Casts sollten auch keine große Sache sein. Sie müssen nicht einmal Bereichsausnahmen ausführen, sondern können die Semantik von '4294966273' :: uint4 :: int einfach als -1024 behandeln. Oder Sie können einen Fehler auslösen.
Wenn ich das gewollt hätte, hätte ich es getan. Da ich Java auf der anderen Seite von SQL verwende, ist es für mich von geringem Wert, da Java auch keine vorzeichenlosen Ganzzahlen hat. Also gewinne ich nichts. Ich ärgere mich schon, wenn ich eine BigInteger aus einer Bigint-Spalte bekomme, wenn sie in lange passen sollte.
Eine andere Sache, wenn ich 32-Bit- oder 64-Bit-Typen speichern musste, kann ich PostgreSQL int4 bzw. int8 verwenden, wobei ich nur daran denke, dass die natürliche Reihenfolge oder Arithmetik nicht zuverlässig funktioniert. Das Speichern und Abrufen bleibt davon jedoch unberührt.
So kann ich ein einfaches vorzeichenloses int8 implementieren:
Zuerst werde ich verwenden
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
)
die minimalen 2 Funktionen uint8_in
und uint8_out
ich muss zuerst definieren.
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;
müssen dies in C uint8_funcs.c implementieren. Also benutze ich das komplexe Beispiel von hier und mache es einfach:
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);
}
na ja, oder du kannst es einfach schon erledigt finden .