2012-06-24 14 views
9

के बीच अंतर डेटाबेस में हेक्साडेसिमल मानों से निपटने के दौरान MySQL UNHEX और X के बीच वास्तव में क्या अंतर है?यूएनएचएक्स और एक्स (MySQL)

उदा।

SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring')); 

SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring'); 

दोनों मुझे सटीक परिणाम सेट देता है। तो क्या कोई अंतर है? प्रदर्शन प्रभाव?

संपादित करें: guidCol के अंतर्निहित प्रकार, निश्चित रूप से बाइनरी

उत्तर

13

UNHEX()a function है इसलिए आप

SET @var = '41'; 
SELECT UNHEX(@var); 
SELECT UNHEX(hex_column) FROM my_table; 

X की तरह कुछ कर सकते हैं, तो दूसरी ओर, एक के लिए वाक्यविन्यास है hexadecimal litteral। यदि आप ऐसा नहीं कर सकते हैं:

SET @var = '41'; 
SELECT [email protected]; -- error (string litteral expected) 
SELECT X'@var'; -- error (`@` is not a hexadecimal digit) 
SELECT X(@var); -- returns NULL, not too sure about the reason... [edit: but this is probably why you are inserting NULL values] 
SELECT X(hex_column) FROM my_table; -- returns NULL as well 

यही कारण है कि आप हमेशा X के साथ बेहतर प्रदर्शन मिलता है: आप एक भाषा के बजाय निर्माण एक समारोह कॉल का उपयोग कर रहे हैं। X को एक चर का मूल्यांकन करने की आवश्यकता नहीं है, क्योंकि यह एक कर्कश स्ट्रिंग की अपेक्षा करता है।

+0

सही उत्तर! धन्यवाद.. – nawfal

1

ध्यान दें कि MySQL 5.6 में भी, एक्स '' नोटेशन में संदर्भ mysql क्लाइंट और UNHEX() में लंबाई सीमा है (दिखाई नहीं दे रहा है)। मुझे नहीं पता कि एक्स 'के लिए सीमा क्या है, क्योंकि इसे आधिकारिक तौर पर दस्तावेज नहीं किया गया है लेकिन मुझे एक ब्लॉब में प्रवेश करने का प्रयास करते समय इसका सामना करना पड़ा है। एक्स '' शाब्दिक के साथ, MySQL क्लाइंट ने पर्याप्त लंबे हेक्स अनुक्रम के साथ एक वाक्यविन्यास त्रुटि फेंक दी, जबकि उसी अनुक्रम के यूएनएचएक्स() ने नहीं किया। जाहिर है, जब वास्तविक GUID की बात आती है तो लंबाई कोई मुद्दा नहीं है, लेकिन मुझे लगा कि यह सामान्य मामले में बाइनरी डेटा के mysql सम्मिलन का उत्तर देने के लिए इस प्रश्न का उपयोग करके किसी और के लिए उपयोगी है।

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