DOMAINSについての話は興味深いですが、その質問の考えられる唯一の原因には関係ありません。符号なし整数の要望は、同じビット数で整数の範囲を2倍にすることです。これは効率の引数であり、負の数を除外したいという意図ではなく、チェック制約を追加する方法を誰もが知っています。
それについて誰かから尋ねられたとき、トメレーンは述べました:
基本的に、多くの既存のアプリケーションを壊さない数値のプロモーション階層にそれらを適合させる方法を見つけられない限り、これが起こる可能性はゼロです。メモリが機能する場合、これを2回以上確認しましたが、POLAに違反していないように見える実用的なデザインを作成できませんでした。
「ポーラ」とは?グーグルは無意味な10の結果を私に与えました。それが政治的に正しくない考えであり、したがって検閲されているかどうかは不明です。この検索語句で結果が得られないのはなぜですか?なんでも。
unsigned intは、あまり問題なく拡張型として実装できます。C関数でそれを行う場合、パフォーマンスの低下はほとんどありません。PgSQLには文字列をリテラルとして解釈する簡単な方法があるので、パーサーを拡張してリテラルを処理する必要はありません。リテラルとして '4294966272' :: uint4と書くだけです。キャストも大したことではありません。範囲の例外を実行する必要すらありません。'4294966273 ':: uint4 :: intのセマンティクスを-1024として扱うことができます。または、エラーをスローすることもできます。
これが欲しかったなら、私はそれをしたでしょう。しかし、私はSQLの反対側でJavaを使用しているので、Javaにもこれらの符号なし整数がないので、私にとってそれはほとんど価値がありません。だから私は何も得ません。bigintカラムからBigIntegerを取得する場合、長く収まるはずですが、私はすでにイライラしています。
もう1つ、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
)
最小2つの関数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);
}
まあ、またはあなたはそれがすでに行われたと見つけることができます。