2012-04-05 15 views
12

MySQL एक अच्छा ऑपरेटर <=> प्रदान करता है जो तुलना के साथ काम करता है जिसमें null <=> null या null <=> 5 इत्यादि शामिल हो सकते हैं। कई प्रोग्रामिंग भाषाओं के रूप में अंतर्ज्ञानी परिणाम प्रदान करते हैं। जबकि सामान्य बराबर ऑपरेटर हमेशा नल लौटाता है, जो कई नए MySQL उपयोगकर्ताओं को पकड़ता है जैसे कि मैं खुद को परेशान करता हूं।क्या <=> (शून्य सुरक्षित ऑपरेटर बराबर ऑपरेटर) का उपयोग करने के कारण mysql में = का उपयोग करने का कोई कारण नहीं है?

क्या कोई कारण है MySQL दोनों में <=> में कार्यक्षमता है? वास्तव में ऐसे ऑपरेटर की आवश्यकता कौन है जो भाषा प्रकारों में निर्मित के साथ प्रभावी ढंग से अपरिभाषित है?

उत्तर

6

MySQL में और प्रोग्रामिंग भाषाओं में अशक्त में बड़ा अंतर यह MySQL में, अशक्त मतलब यह है कि अज्ञात मूल्य जबकि प्रोग्रामिंग में इसका मतलब है अपरिभाषित मूल्य है।

mySQL में, शून्य शून्य के बराबर नहीं है (अज्ञात अज्ञात नहीं है)। प्रोग्रामिंग भाषाओं में, शून्य शून्य बराबर है (अपरिभाषित अपरिभाषित बराबर)।

+3

हाँ, लेकिन इसके लिए कोई तार्किक कारण है? इससे वास्तविक दुनिया की समस्या क्या आसान बनाती है? – Jonathon

2

क्या कोई कारण है MySQL में < => में कार्यक्षमता दोनों हैं? ऑपरेटर एक दूसरे से बिल्कुल अलग हैं।

<=>= ऑपरेटर की तरह एक समानता तुलना करता है, लेकिन 1 बजाय NULL अगर दोनों ऑपरेंड NULL हैं, और 0 बजाय NULL रिटर्न अगर एक संकार्य NULL है।

वास्तव में ऐसे ऑपरेटर की आवश्यकता है जो प्रभावी रूप से निर्मित भाषा प्रकारों में प्रभावी ढंग से अपरिभाषित है?

यह इस मामले पर निर्भर करता है, सिर्फ इसलिए कि आपको ऐसे मामलों का सामना नहीं हुआ है, इसका मतलब यह नहीं है कि किसी को इसकी आवश्यकता नहीं है।

+0

क्या कोई भी किसी भी मामले के बारे में सोच सकता है? क्योंकि मैं पेशेवर विकास के एक दशक से अधिक समय में <=> पर = = के व्यवहार का उपयोग कर सकता था, जहां मैं वापस नहीं सोच सकता। – cellige

+0

यदि मैं एक अलग व्यवहार प्रदान करता हूं तो इसका उपयोग देख सकता है लेकिन जब NULL के साथ उपयोग किया जाता है तो यह कोई व्यवहार नहीं करता है क्योंकि परिणाम हमेशा शून्य तक होता है जब तक कि नल अभिव्यक्ति में न हो .. – cellige

+2

@cellige यह कोई (उचित, उपयोगी) प्रदान नहीं करता है एक शून्य शाब्दिक के साथ प्रयोग करते समय व्यवहार। लेकिन दो गैर-शाब्दिक और निरर्थक अभिव्यक्तियों की तुलना करते समय, यह निश्चित रूप से ऐसा कुछ करता है जिसे कोई उचित रूप से चाहे। –

10

वास्तव में ऐसे ऑपरेटर की आवश्यकता है जो प्रभावी रूप से भाषा प्रकारों में निर्मित के साथ अनिर्धारित है?

आपने कुछ वास्तविक दुनिया के उदाहरणों के लिए कहा। यहाँ एक नकली है। मान लें कि आपके पास एक आवासीय युवा कार्यक्रम या समान है, और आवश्यकताओं में से एक यह है कि बच्चे केवल एक ही लिंग के साथ एक कमरा साझा करते हैं। आपके डेटाबेस में आपके पास एक शून्यमान एम/एफ फ़ील्ड है - शून्य है क्योंकि आपकी डेटा फीड अपूर्ण है (आप अभी भी कुछ डेटा का पीछा कर रहे हैं)। आपका कमरा-मिलान कोड निश्चित रूप से उन छात्रों से मेल नहीं खा सकता है जहां t1.Gender < => t2. लिंग, क्योंकि यह अज्ञात लिंग के दो बच्चों से मेल खाता है, जो विपरीत लिंग के हो सकते हैं। इसके बजाए, आप मेल खाते हैं जहां वे बराबर हैं और दोनों शून्य नहीं हैं।

यह सिर्फ एक उदाहरण है। मैं मानता हूं कि NULL और = ऑपरेटर के व्यवहार ने पिछले कुछ वर्षों में बहुत भ्रम पैदा किया है, लेकिन अंत में गलती शायद ऑनलाइन माईएसQL ट्यूटोरियल के साथ निहित है जो इस बात का कोई जिक्र नहीं करती है कि कैसे NULL ऑपरेटरों के साथ बातचीत करता है, न ही अस्तित्व के <=> ऑपरेटर।

+0

अच्छा उदाहरण। Paraphrase और संभवतः विस्तृत करने के लिए। 'शून्य' अभिव्यक्ति उपयोगी हो सकती है जब फ़ील्ड में संभावित मानों की सीमित संख्या हो, हालांकि फ़ील्ड को एप्लिकेशन के निष्पादन में बाद के बिंदु तक अपरिभाषित करने की इजाजत दी जा सकती है? – PdC

+0

मैं एक कदम आगे जाऊंगा - मुझे नहीं लगता कि वे केवल सीमित संख्याओं के साथ उपयोगी क्यों हैं (जाहिर है कि सभी एसक्यूएल फ़ील्ड में मूल्यों की सीमित संख्या है, लेकिन मुझे लगता है कि आपका मतलब _small_ सीमित संख्या है !) शून्य मान सभी प्रकार के मामलों में अच्छी तरह से काम करते हैं जहां डेटा मान ज्ञात नहीं हैं (चाहे वे बाद में ज्ञात हो या नहीं)। – almcnicoll

4

वास्तव में ऐसे ऑपरेटर की आवश्यकता है जो प्रभावी रूप से भाषा प्रकारों में प्रभावी ढंग से अपरिभाषित है?

आपको अपने डेटाबेस के अंदर संबंधों के लिए भी इसकी आवश्यकता है। विशेष रूप से यदि आप विदेशी कुंजी बाधाओं का उपयोग कर रहे हैं।

उदाहरण के लिए यदि आपके पास कार्यों (आपकी कंपनी में) के लिए एक टेबल है। तो आप इन कार्यों को कर्मचारियों को असाइन करते हैं। इसलिए आपके कार्यों-टेबल से आपके कर्मचारियों-टेबल पर संबंध है।
और हमेशा कुछ असाइन किए गए कार्य होंगे। इस मामले में आप अपने कार्य-तालिका में फ़ील्ड तालिका तालिका के संबंध में उपयोग करते हैं जिसमें NULL होगा। यह सुनिश्चित करेगा कि यह कार्य असाइन नहीं किया गया है। जिसका अर्थ है: कर्मचारियों की मेज से संबंध होने की कोई संभावना नहीं है।

यदि NULL = NULLtrue होगा, तो मेरे उदाहरण में हमेशा यह संभावना होगी कि कर्मचारी तालिका में विदेशी कुंजी भी NULL है। इस प्रकार कार्य एक या कुछ कर्मचारियों को सौंपा जाएगा। और आप निश्चित रूप से यह सुनिश्चित करने में सक्षम नहीं होंगे कि कुछ कर्मचारी को कोई कार्य सौंपा गया है या नहीं।

1

हां।

इसका कारण यह है रिलेशनल डेटाबेस three-valued logic (TRUE, NULL, FALSE) के सिद्धांत का उपयोग किया जाना चाहिए।

और तीन मूल्यवान तर्क को काम करना चाहिए क्योंकि यह आंतरिक रूप से सुसंगत होना चाहिए।

यह गणित के नियमों से पालन करता है।

Comparisons with NULL and the three-valued logic

+1

यह मेरी राय में सबसे अच्छा जवाब है। –