DOMAINS에 대한 이야기는 흥미롭지 만 해당 질문의 유일한 출처와 관련이 없습니다. unsigned int에 대한 욕구는 동일한 비트 수로 int의 범위를 두 배로 늘리는 것입니다. 이는 음수를 제외하려는 욕구가 아니라 효율성 인수입니다. 모두가 검사 제약 조건을 추가하는 방법을 알고 있습니다.
누군가가 그것에 대해 물었을 때 , Tome Lane은 다음과 같이 말했습니다.
기본적으로 많은 기존 응용 프로그램을 손상시키지 않는 숫자 프로모션 계층 구조에이를 맞추는 방법을 찾을 수 없으면 이런 일이 발생할 가능성이 없습니다. 우리는 기억이 작용한다면 이것을 한 번 이상 살펴 보았지만 POLA를 위반하지 않는 것처럼 보이는 실행 가능한 디자인을 찾지 못했습니다.
"POLA"는 무엇입니까? Google은 의미없는 10 개의 결과를주었습니다 . 정치적으로 잘못된 생각인지, 따라서 검열되었는지 확실하지 않습니다. 이 검색어가 결과를 산출하지 못하는 이유는 무엇입니까? 도대체 무엇이.
별다른 문제없이 unsigned int를 확장 유형으로 구현할 수 있습니다. C- 함수를 사용하면 성능 저하가 전혀 발생하지 않습니다. PgSQL에는 문자열을 리터럴로 해석하는 쉬운 방법이 있기 때문에 구문 분석기를 확장하여 리터럴을 처리 할 필요가 없습니다. '4294966272':: uint4를 리터럴로 작성하면됩니다. 캐스트도 큰 문제는 아닙니다. 범위 예외를 수행 할 필요조차 없습니다. '4294966273':: uint4 :: int의 의미를 -1024로 처리하면됩니다. 또는 오류를 던질 수 있습니다.
내가 이것을 원했다면 내가했을 것입니다. 그러나 SQL의 반대편에서 Java를 사용하고 있기 때문에 Java에는 부호없는 정수가 없기 때문에 가치가 거의 없습니다. 그래서 나는 아무것도 얻지 못합니다. bigint 열에서 BigInteger를 가져 오면 길이가 길 때 이미 짜증이납니다.
또 다른 한가지, 32 비트 또는 64 비트 유형을 저장할 필요가 있다면 PostgreSQL int4 또는 int8을 각각 사용할 수 있습니다. 다만 자연 순서 나 산술이 안정적으로 작동하지 않는다는 점만 기억하면됩니다. 그러나 저장 및 검색은 그 영향을받지 않습니다.
다음은 간단한 unsigned 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);
}
아 글쎄, 아니면 그냥 이미 끝났어 .