Cuộc thảo luận về DOMAINS rất thú vị nhưng không liên quan đến nguồn gốc duy nhất có thể có của câu hỏi đó. Mong muốn cho các số nguyên không dấu là tăng gấp đôi phạm vi các số nguyên có cùng số bit, đó là một đối số hiệu quả, không phải mong muốn loại trừ các số âm, mọi người đều biết cách thêm một ràng buộc kiểm tra.
Khi được ai đó hỏi về nó , Tome Lane nói:
Về cơ bản, không có khả năng điều này xảy ra trừ khi bạn có thể tìm ra cách điều chỉnh chúng vào hệ thống phân cấp quảng cáo số mà không phá vỡ nhiều ứng dụng hiện có. Chúng tôi đã xem xét điều này nhiều lần, nếu bộ nhớ phục vụ và không đưa ra được thiết kế khả thi mà dường như không vi phạm POLA.
"POLA" là gì? Google đã cho tôi 10 kết quả vô nghĩa . Không chắc đó có phải là suy nghĩ không chính xác về mặt chính trị và do đó bị kiểm duyệt hay không. Tại sao cụm từ tìm kiếm này không mang lại bất kỳ kết quả nào? Bất cứ điều gì.
Bạn có thể triển khai các int không dấu dưới dạng các loại tiện ích mở rộng mà không gặp quá nhiều khó khăn. Nếu bạn làm điều đó với C-functions, thì sẽ không bị phạt về hiệu suất. Bạn sẽ không cần phải mở rộng trình phân tích cú pháp để xử lý các ký tự vì PgSQL có một cách dễ dàng để giải thích các chuỗi dưới dạng các ký tự, chỉ cần viết '4294966272' :: uint4 làm các ký tự của bạn. Diễn viên cũng không phải là một vấn đề lớn. Bạn thậm chí không cần thực hiện các ngoại lệ phạm vi, bạn chỉ có thể xử lý ngữ nghĩa của '4294966273' :: uint4 :: int là -1024. Hoặc bạn có thể ném một lỗi.
Nếu tôi muốn điều này, tôi đã làm được. Nhưng vì tôi đang sử dụng Java ở phía bên kia của SQL, đối với tôi nó chẳng có giá trị gì vì Java cũng không có những số nguyên không dấu đó. Vì vậy, tôi không đạt được gì. Tôi đã rất khó chịu nếu tôi nhận được BigInteger từ một cột bigint, khi nó sẽ phù hợp với dài.
Một điều khác, nếu tôi có nhu cầu lưu trữ các loại 32 bit hoặc 64 bit, tôi có thể sử dụng PostgreSQL int4 hoặc int8 tương ứng, chỉ cần nhớ rằng thứ tự tự nhiên hoặc số học sẽ không hoạt động đáng tin cậy. Nhưng việc lưu trữ và truy xuất không bị ảnh hưởng bởi điều đó.
Đây là cách tôi có thể triển khai một int8 không dấu đơn giản:
Đầu tiên tôi sẽ sử dụng
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 chức năng tối thiểu uint8_in
và uint8_out
tôi phải xác định trước.
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ần thực hiện điều này trong C uint8_funcs.c. Vì vậy, tôi sử dụng ví dụ phức tạp từ đây và làm cho nó đơn giản:
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);
}
à tốt, hoặc bạn có thể thấy nó đã hoàn thành .