वहाँ वास्तव में तीन प्रश्न हैं जिनका मैं उत्तर देने का प्रयास करूँगा।
-
unknown
. का उद्देश्य क्या है? ?यह डेटा प्रकार शुरू में एनयूएलएल और एसक्यूएल स्टेटमेंट में स्ट्रिंग अक्षर को सौंपा गया है। यदि ऐसे शाब्दिकों को टाइप किया गया था
text
तुरंत, सही प्रकार का अनुमान लगाना कठिन होगा।उदाहरण के लिए, आप
myfunc('hello')
. चाहते हैंmyfunc(character varying)
का आह्वान करने के लिए , लेकिनtext
. से कोई अंतर्निहित प्रकार नहीं डाला गया है सेcharacter varying
(और अगर आपने इसे बनाया है तो यह अस्पष्टता पैदा करेगा)। -
क्यों
SELECT null
unknown
. प्रकार का कॉलम लौटाएं ?पारंपरिक उत्तर है:क्योंकि उपयोगकर्ता ने प्रकार निर्दिष्ट नहीं किया था।
हालाँकि, यह व्यवहार समस्याग्रस्त रहा है। उदाहरण के लिए, यदि आप इस तरह की तालिका बनाते हैं:
CREATE TABLE test AS SELECT 'hello';
आप
unknown
. प्रकार के कॉलम के साथ समाप्त होंगे , जो अवांछित है और आगे भी समस्याएं पैदा करेगा। प्रकारunknown
वास्तव में उपयोगकर्ता दृश्यमान नहीं होना चाहिए, बल्कि एक कार्यान्वयन विवरण होना चाहिए।नतीजतन, यह कमिट PostgreSQL v10 से व्यवहार को बदल दिया है:अब कोई भी
unknown
SELECT
. में छोड़ दिया गया है याRETURNING
सूची कोtext
के लिए बाध्य किया जाता है , और तालिकाएंunknown
. प्रकार के स्तंभों के साथ नहीं बनाई जा सकतीं । -
SELECT NULL UNION SELECT 42
काम करते हैं, लेकिन नहींSELECT NULL UNION SELECT NULL UNION SELECT 42
?यह टाइप कन्वर्ज़न नियम के कारण देय है .
UNION
साहचर्य छोड़ दिया गया है, इसलिए बाद की क्वेरी की व्याख्या इस प्रकार की जाती है(SELECT NULL UNION SELECT NULL) UNION SELECT 42;
अब पहला
UNION
डेटा प्रकारtext
. का समाधान करता है नियम 3 के कारण:दूसरे
UNION
. के प्रकार को हल करने का प्रयास करते समय यह त्रुटि उत्पन्न करता है नियम 4 के कारण:दूसरी ओर, क्वेरी में
SELECT NULL UNION SELECT 42;
“NULL” का प्रकार
unknown
है , और “42” का प्रकारinteger
. है (दशमलव बिंदु के बिना संख्यात्मक शाब्दिक के लिए चुना गया प्रकार)।नियम 5
यहां लागू नहीं होता, क्योंकि
integer
अपनी श्रेणी में पसंदीदा प्रकार नहीं है (जो किoid
. होगा) औरdouble precision
), इसलिए नियम 6 का उपयोग किया जाता है:इसका परिणाम एक प्रकार का
integer
होता है ।