2012-05-08 19 views
8

यदि डेटाबेस पंक्ति इस तरह है: country = 'usa' और मैं "select * from data where country = 'usa '" क्वेरी करता हूं यह भी यह पंक्ति देता है। तो यह एक सटीक मैच नहीं है।MySQL तुलना ऑपरेटर, रिक्त स्थान

MySQL ऐसा क्यों करता है? और अन्य मामलों में यह सच भी वापस आ जाएगा जब यह वास्तव में सच नहीं है?

उत्तर

4

कॉलम char या varchar प्रकार के होने पर पिछली जगहों को छोड़ दिया जाता है; like 'usa ' का उपयोग करके समस्या

+0

+1, http://dev.mysql.com/doc/refman/5.0/en/char.html, जब CHAR मान प्राप्त किए गए हैं, पीछे वाले स्पेस निकाल दिए जाते हैं। –

0

like के साथ या इस

country = 'usa ' AND LENGTH(country) = LENGTH('usa ') 
9

the manual में उल्लेख किया है के साथ प्रयास करें निराकरण:

सभी MySQL collations प्रकार PADSPACE के हैं। इसका मतलब है कि MySQL में सभी CHAR और VARCHAR मान किसी पीछे की रिक्त स्थान के बिना तुलना किए जाते हैं।

LIKE ऑपरेटर की परिभाषा में, यह कहा गया है:

विशेष रूप से, पीछे वाले स्पेस जो CHAR या VARCHAR तुलना = ऑपरेटर के साथ प्रदर्शन के लिए सच नहीं है, महत्वपूर्ण हैं:

जैसा कि this answer में उल्लेख किया गया है:

यह व्यवहार SQL-92 और SQL: 2008 में निर्दिष्ट है। तुलना के प्रयोजनों के लिए, छोटी स्ट्रिंग लंबी स्ट्रिंग की लंबाई तक गद्देदार है।

मसौदा से (8.2 < तुलना विधेय >):

तो एक्स के पात्रों में लंबाई Y के पात्रों में लंबाई के बराबर नहीं है, तो छोटे स्ट्रिंग प्रभावी रूप से बदल दिया जाता है, प्रयोजनों के लिए तुलनात्मक रूप से, स्वयं की एक प्रति के साथ जो एक या अधिक पैड वर्णों के दायीं तरफ संगतता द्वारा लंबी स्ट्रिंग की लंबाई तक बढ़ा दी गई है, जहां पैड चरित्र सीएस के आधार पर चुना जाता है। यदि सीएस में कोई पीएडी विशेषता नहीं है, तो पैड कैरेक्टर एक कार्यान्वयन-निर्भर चरित्र है जो एक्स और वाई के चरित्र सेट में किसी भी चरित्र से भिन्न होता है जो सीएस के तहत किसी भी स्ट्रिंग से कम होता है। अन्यथा, पैड वर्ण < स्थान > है।

अन्य उत्कृष्ट समाधान के अलावा: यदि स्तंभ प्रकार चार या varchar की है

select binary 'a' = 'a ' 
+0

बहुत अच्छा जवाब –

+0

@eggyal, तो ** ** ** क्या है? – Pacerier

0

मैनुअल यह कहता है:

सभी MySQL collations प्रकार PADSPACE हैं। इसका मतलब है कि सभी CHAR और MySQL में VARCHAR मानों की तुलना किसी भी पीछे की जगहों के बिना की जाती है [...] यह सभी MySQL संस्करणों के लिए सच है, और सर्वर SQL मोड से प्रभावित नहीं है।

http://dev.mysql.com/doc/refman/5.5/en/char.html

आप रिक्त स्थान विचार करने की जरूरत है, तो आप मूल रूप से भाषा-अवगत छंटाई से छुटकारा पाने के लिए है। बाइनरी संयोजन को मजबूर करना एक आसान तरीका है। चलाने के लिए और तुलना करें:

SELECT 'ab'='ab ', BINARY 'ab'='ab ' 
+0

सुपर पैडेंटिक अवलोकन: यहां 'बिनरी' ऑपरेटर "बाइनरी collation मजबूर नहीं कर रहा है", जो 'COLLEATE * _bin' क्लॉज लागू करके पूरा किया जाएगा, बल्कि इसके बाइनरी स्ट्रिंग पर इसके nonbinary ऑपरेंड कास्टिंग कर रहा है-इसका प्रभाव तो ऐसा करना यह है कि तुलना बिल्कुल बाइट-फॉर-बाइट है, जो बाइनरी संयोजन के समान होती है (सिवाय इसके कि बाइनरी कॉलेशन अभी भी पैडस्पेस हैं)। पाठकों को इस अंतर से अवगत होना उपयोगी हो सकता है, मैन्युअल अनुभाग [_bin और बाइनरी कॉलेशन] में अधिक विस्तार से समझाया गया है (https://dev.mysql.com/doc/en/charset-binary-collations.html) । – eggyal

+0

धन्यवाद, ये स्पष्टीकरण कभी भी जगह से बाहर नहीं हैं। मैं यह भी नहीं छोड़ूंगा कि वास्तव में मुझे "द्विआधारी तुलना" दिमाग में था, लेकिन बस इसे गलत टाइप किया- मैं अक्सर यह करता हूं :) –

संबंधित मुद्दे