संस्करण 10.3.1 के बाद से, मारियाडीबी ने LENGTH()
. दोनों को शामिल किया है फ़ंक्शन और एक LENGTHB()
समारोह।
उस दूसरे में एक B
है नाम के अंत में। तो यह एक तरह का है Length A
और Length B
, सिवाय इसके कि Length A
A
नहीं है ।
भ्रमित?
मैं था, जब मैंने पहली बार LENGTHB()
. का सामना किया था . मुझे पहले से ही LENGTH()
के बारे में पता था , तो "बी" संस्करण की आवश्यकता क्यों है?
आइए जानें।
Oracle संगतता
मारियाडीबी अंक 12783 के अनुसार, LENGTHB()
. से पहले पेश किया गया था (और LENGTH()
. से पहले संशोधित किया गया था) चीजें इस तरह काम करती थीं:
- MariaDB फ़ंक्शन का अनुवाद करता है
LENGTH()
SQL मानक फ़ंक्शन के लिएOCTET_LENGTH()
। - Oracle फंक्शन का अनुवाद करता है
LENGTH()
SQL मानक फ़ंक्शन के लिएCHAR_LENGTH()
।
इसके बाद मारियाडीबी के LENGTH()
. को बदलने का निर्णय लिया गया यह किस SQL मोड में चल रहा है, इसके आधार पर यह अलग तरह से व्यवहार करता है। विशेष रूप से:
- डिफ़ॉल्ट मोड में चलने पर (यानी
sql_mode=DEFAULT
), मारियाडीबीLENGTH()
का अनुवाद करना जारी रखेगा करने के लिएOCTET_LENGTH()
। - हालांकि, Oracle मोड में चलने पर (यानी
sql_mode=ORACLE
), यह अनुवाद करता हैLENGTH()
करने के लिएCHAR_LENGTH()
इसके बजाय।
पेश है LENGTHB()
जो हमें LENGTHB()
पर लाता है समारोह।
LENGTHB()
फ़ंक्शन को उसी कार्य के भाग के रूप में जोड़ा गया था।
LENGTHB()
OCTET_LENGTH()
. का पर्यायवाची है SQL मोड की परवाह किए बिना। दूसरे शब्दों में, LENGTHB()
OCTET_LENGTH()
में अनुवाद करता है जब sql_mode=DEFAULT
और जब sql_mode=ORACLE
।
यह हमें LENGTHB()
. का उपयोग करने में सक्षम बनाता है उपयोगकर्ता के sql_mode
. से प्रभावित होने की चिंता किए बिना हमारे कोड में सेटिंग्स।
अंतर
इन दो कार्यों के बीच का अंतर निम्न तालिका में बताया गया है।
कार्य | डिफ़ॉल्ट मोड | Oracle मोड |
---|---|---|
LENGTH() | बाइट्स की संख्या लौटाता है। | वर्णों की संख्या लौटाता है। |
LENGTHB() | बाइट्स की संख्या लौटाता है। | बाइट्स की संख्या लौटाता है। |
ध्यान दें कि यह अंतर केवल मारियाडीबी 10.3.1 से मौजूद है। उससे पहले, LENGTHB()
मौजूद नहीं है, और LENGTH()
बस OCTET_LENGTH()
में अनुवाद करता है ।
उदाहरण
यहां एक उदाहरण दिया गया है जो LENGTH()
. के बीच के अंतर को दर्शाता है और LENGTHB()
।
आइए अपने सत्र को डिफ़ॉल्ट मोड का उपयोग करने के लिए सेट करें:
SET SESSION sql_mode=DEFAULT;
मेरा सत्र शायद पहले से ही डिफ़ॉल्ट मोड में था, लेकिन इसे स्पष्ट रूप से सेट करने में कोई बुराई नहीं है।
अब चलते हैं LENGTH()
और LENGTHB()
इसी तर्क के साथ:
SELECT
LENGTH('café'),
LENGTHB('café');
परिणाम:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 5 | 5 | +-----------------+------------------+
इसलिए, जब डिफ़ॉल्ट मोड में, वे दोनों समान मान लौटाते हैं।
इस मामले में, वे दोनों 5
returned लौट आए , क्योंकि उस स्ट्रिंग में 5 बाइट्स हैं (é
वर्ण 2 बाइट्स का उपयोग करता है, और अन्य सभी 1 बाइट प्रत्येक का उपयोग करते हैं)।
आइए अब Oracle मोड पर स्विच करें:
SET SESSION sql_mode=ORACLE;
अब उपरोक्त कथन को फिर से चलाते हैं:
SELECT
LENGTH('café'),
LENGTHB('café');
परिणाम:
+-----------------+------------------+ | LENGTH('café') | LENGTHB('café') | +-----------------+------------------+ | 4 | 5 | +-----------------+------------------+
इस बार दोनों कार्यों में अंतर है। इस बार LENGTH()
लौटा 4
. यह पहले से 1 कम है।
ऐसा इसलिए है क्योंकि LENGTH()
Oracle मोड में अलग तरह से व्यवहार करता है। जैसा कि बताया गया है, जब sql_mode=ORACLE
, LENGTH()
फ़ंक्शन का अनुवाद CHAR_LENGTH()
. में होता है , जो वर्णों की संख्या देता है - बाइट्स नहीं।
पिछले उदाहरण में, LENGTH()
बाइट्स की संख्या लौटा दी, क्योंकि जब sql_mode=DEFAULT
, यह OCTET_LENGTH()
. में अनुवाद करता है ।