DOMAINS के बारे में बात दिलचस्प है लेकिन उस प्रश्न के एकमात्र संभावित मूल के लिए प्रासंगिक नहीं है। अहस्ताक्षरित किलों की इच्छा समान संख्या में बिट्स के साथ ints की सीमा को दोगुना करना है, यह एक दक्षता तर्क है, नकारात्मक संख्याओं को बाहर करने की इच्छा नहीं है, हर कोई जानता है कि एक चेक बाधा कैसे जोड़ना है।
जब किसी ने इसके बारे में पूछा , तो टोम लेन ने कहा:
मूल रूप से, शून्य मौका है यह तब तक होगा जब तक कि आप उन्हें संख्यात्मक पदोन्नति पदानुक्रम में फिट करने का एक तरीका नहीं पा सकते हैं जो बहुत सारे मौजूदा अनुप्रयोगों को नहीं तोड़ता है। हमने इसे एक से अधिक बार देखा है, यदि स्मृति कार्य करती है, और एक व्यावहारिक डिजाइन के साथ आने में विफल रही जो पीओएलए का उल्लंघन नहीं करती थी।
"POLA" क्या है? Google ने मुझे 10 परिणाम दिए जो कि व्यर्थ हैं । यकीन नहीं होता कि यह राजनीतिक रूप से गलत है और इसलिए सेंसर किया गया। यह खोज शब्द कोई परिणाम क्यों नहीं देगा? जो कुछ।
आप बिना अधिक परेशानी के एक्सटेंशन प्रकार के रूप में अहस्ताक्षरित इनट्स को लागू कर सकते हैं। यदि आप इसे सी-फ़ंक्शंस के साथ करते हैं, तो कोई प्रदर्शन दंड नहीं होगा। आपको शाब्दिकों से निपटने के लिए पार्सर का विस्तार करने की आवश्यकता नहीं होगी क्योंकि PgSQL में स्ट्रिंग्स को शाब्दिक रूप से व्याख्या करने का इतना आसान तरीका है, बस '4294966272' :: uint4 को अपने शाब्दिक रूप में लिखें। कास्ट एक बड़ी बात नहीं होनी चाहिए। आपको सीमा अपवाद करने की भी आवश्यकता नहीं है, आप बस '4294966273' के शब्दार्थ का इलाज कर सकते हैं :: uint4 :: int as -1024। या आप एक त्रुटि फेंक सकते हैं।
अगर मुझे ये चाहिए होता तो मैं कर देता। लेकिन जब से मैं एसक्यूएल के दूसरी तरफ जावा का उपयोग कर रहा हूं, मेरे लिए यह बहुत कम मूल्य का है क्योंकि जावा में उन अहस्ताक्षरित पूर्णांक नहीं हैं। इसलिए मुझे कुछ नहीं मिला। अगर मैं एक 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
)
न्यूनतम 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);
}
अच्छी तरह से आह, या आप बस इसे पहले से ही पा सकते हैं ।