PostgreSQL में एक-बाइट पूर्णांक कैसे स्टोर करें?


14

PostgreSQL दस्तावेज़ीकरण में, यह कहा जाता है कि पूर्णांक डेटा प्रकारों को दो में संग्रहीत किया जा सकता है-, चार- या आठ-बाइट स्थान। मेरे डेटाबेस में एक तालिका के स्तंभों में एक-बाइट पूर्णांक मान होता है और मैं चाहता हूं कि इसे एक-बाइट डेटा प्रकार में संग्रहीत किया जाए।

  1. क्या PostgreSQL में एक-बाइट पूर्णांक डेटा प्रकार का उपयोग करने का कोई एक्सटेंशन या तरीका है?
  2. NUMERIC (1,0) कितने बाइट्स है?

जवाबों:


16

नहीं , Postgres के मानक वितरण में कोई 1-बाइट पूर्णांक नहीं है। सभी अंतर्निहित संख्यात्मक प्रकार के मानक 2 या अधिक बाइट्स पर कब्जा कर लेते हैं।

विस्तार की गुत्थी

लेकिन हाँ , वहाँ एक्सटेंशन पिगिंट है , जिसे पीटर एइसेंट्रौट द्वारा बनाए रखा गया है, जो पोस्टग्रेज कोर डेवलपर्स में से एक है। यह मानक वितरण का हिस्सा नहीं है:

विभिन्न अहस्ताक्षरित पूर्णांक प्रकारों के अलावा, यह आपके द्वारा खोजा जाने वाला 1-बाइट पूर्णांक भी प्रदान करता है:

int1 (signed 8-bit integer)
uint1 (unsigned 8-bit integer)
uint2 (unsigned 16-bit integer)
uint4 (unsigned 32-bit integer)
uint8 (unsigned 64-bit integer)

संभावित जटिलताओं को समझाते हुए, लिंक किए गए साइट पर अध्याय "चर्चा" को पढ़ना सुनिश्चित करें। जब अधिक पूर्णांक प्रकारों की शुरुआत की जाती है, तो आपको टाइप कास्ट और न्यूमेरिक लिटरल के साथ देखभाल करने की आवश्यकता होती है ...

वैकल्पिक हल

एक संभावित, सरल वर्कअराउंड 1-बाइट पूर्णांक मानों को सांकेतिक शब्दों में बदलना होगा "char", एक "आंतरिक" सरलीकृत 1-वर्ण प्रकार, जो वास्तव में संग्रहण के एक बाइट का उपयोग करता है , एक हस्ताक्षरित 1-बाइट पूर्णांक के बाइट मान, ऊपरी रूप में दर्शाया गया ASCII वर्ण।

आप -128 के दायरे से 127 में मानों को एनकोड कर सकते हैं । डेमो:

SELECT i
     , i::"char"
     , i::"char"::int
FROM   generate_series(-128,127) i;

ऐसे कई चरित्र हैं जो प्रदर्शन के लिए नहीं हैं। तो एनकोड इससे पहले कि आप की दुकान और डिकोड इससे पहले कि आप प्रदर्शित ...

याद रखें: "char"एक "आंतरिक" प्रकार है जिसका उद्देश्य सरल और सस्ते गणना है। आधिकारिक तौर पर नहीं कि हम यहां क्या कर रहे हैं, और अन्य RDBMS के लिए पोर्टेबल नहीं है। इसके लिए पोस्टग्रेज परियोजना द्वारा कोई गारंटी नहीं है।

मेरे शुरुआती सुझाव इस धारणा के आधार पर लापरवाही से थे कि हम एक अहस्ताक्षरित 1-बाइट पूर्णांक (0-255) की सीमा को कवर करेंगे और हम textकदम पत्थर के रूप में उपयोग कर सकते हैं । इवान ने मेरे रास्ते की त्रुटियों को इंगित किया: यह केवल संख्या 1 - 127 के लिए काम करता है और बाकी के लिए विफल रहता है। इसके बजाय, पूर्णांक श्रेणी -128 का उपयोग 127 और दोनों समस्याओं को ठीक करने के बीच "char"और integerसीधे कास्ट करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.