MySQL - लंबाई () बनाम char_length ()


215

मुख्य अंतर क्या है length()और char_length()?

मेरा मानना ​​है कि इसका बाइनरी और गैर-बाइनरी स्ट्रिंग्स के साथ कुछ करना है। क्या स्ट्रिंग्स को बाइनरी के रूप में संग्रहीत करने का कोई व्यावहारिक कारण है?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
हां, बाइनरी स्ट्रिंग्स को स्टोर करने के लिए व्यावहारिक कारण हैं जब वे वास्तव में बाइनरी स्ट्रिंग्स होते हैं, जैसे संकुचित।
sanmai

जवाबों:


351

LENGTH()बाइट्स में मापा गया स्ट्रिंग की लंबाई लौटाता है । वर्णों में मापी गई स्ट्रिंग
CHAR_LENGTH() की लंबाई देता है ।

यह यूनिकोड के लिए विशेष रूप से प्रासंगिक है, जिसमें अधिकांश वर्ण दो बाइट्स में एन्कोडेड हैं। या यूटीएफ -8, जहां बाइट्स की संख्या भिन्न होती है। उदाहरण के लिए:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

जैसा कि आप देख सकते हैं कि यूरो साइन 3 बाइट्स रखता है (यह 0xE282ACयूटीएफ -8 में एन्कोडेड है ) भले ही यह केवल एक चरित्र है।


6
केवल UCS-2 प्रति वर्ण में दो बाइट्स में एन्कोडेड है। यह एन्कोडिंग (या अधिक सटीक रूप से UTF-16LE) है जिसे विंडोज़ भ्रामक रूप से "यूनिकोड" कहता है। MySQL UTF-16 का समर्थन नहीं करता है; यूनिकोड के तार लगाने के लिए सामान्य दृष्टिकोण के बजाय UTF-8 का उपयोग करना है।
बॉब

2
उदाहरण के लिए: चयन लंबाई ('क्रोन'), चार_लगाव ('क्रोन');
sanmai

@ बॉबिन: यहां तक ​​कि यूसीएस -2 उदाहरण के लिए, 2 से अधिक बाइट्स में कुछ पात्रों को एनकोड करता है 0313 combining comma above। A = 61 के बाद से, 0x00610313 a 0 के रूप में प्रदर्शित होता है, और इसमें 4 बाइट्स लगते हैं।
एंडोमर

2
वास्तव में यूनिकोड शब्दावली द्वारा अभी भी 2 वर्ण हैं, भले ही सभी संयोजन के निशान की तरह - यदि एक उपयुक्त फ़ॉन्ट उपलब्ध है - एकल ग्लिफ़ के रूप में प्रस्तुत किया जा सकता है। UTF-16LE में अभी भी 4-बाइट चरित्र हो सकता है, हालांकि सरोगेट्स के लिए धन्यवाद।
22

6
तो मुझे अपने वर्कर कॉलम का आकार बदलने के लिए इन कार्यों में से किसका उपयोग करना चाहिए? तालिका बनाते समय कहते हैं कि एक कॉलम VARCHAR (10) है। क्या यह अधिकतम १० अक्षर या अधिकतम १० बाइट्स की अनुमति देगा?
still_dreaming_1

19

varchar (10) 10 वर्णों को संगृहीत करेगा, जो 10 बाइट्स से अधिक हो सकता है। अनुक्रमित में, यह क्षेत्र की अधिकतम लंबाई आवंटित करेगा - इसलिए यदि आप UTF8-mb4 का उपयोग कर रहे हैं, तो यह 10 वर्ण फ़ील्ड के लिए 40 बाइट आवंटित करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.