MySQL VARCHAR लंबाई और UTF-8


84

MySQL में, यदि मैं VARCHAR(32)UTF-8 तालिका में एक नया क्षेत्र बनाता हूं तो इसका मतलब है कि मैं उस क्षेत्र में 32 बाइट डेटा या 32 वर्ण (बहु-बाइट) संग्रहीत कर सकता हूं?


@naXa: मैंने नहीं किया। आपको लगता है कि मुझे करना चाहिए?
एलिक्स एक्सल

मुझे नहीं पता।) यह आपका सवाल है, और यह आपके ऊपर है। मैं सिर्फ यह कहना चाहता था कि "एक और उत्तर अधिक पूर्ण दिखता है"।
naXa

@robsch पिछला स्वीकृत उत्तर सरल और सही था। लेकिन लोकप्रिय मांग के लिए आप जो चाहते हैं उसे मैंने स्वीकार कर लिया है।
एलिक्स एक्सल

जवाबों:


168

यह उत्तर मेरे Google खोज परिणामों में सबसे ऊपर दिखा लेकिन यह सही नहीं था:

भ्रम की वजह शायद mysql के विभिन्न संस्करणों का परीक्षण किया जाना है।

  • संस्करण 4 बाइट्स गिना जाता है
  • संस्करण 5 वर्ण गिना जाता है

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

MySQL चरित्र इकाइयों में चरित्र स्तंभ परिभाषाओं में लंबाई विनिर्देशों की व्याख्या करता है। (MySQL 4.1 से पहले, कॉलम की लंबाई बाइट्स में व्याख्या की गई थी।) यह CHAR, VARCHAR और पाठ प्रकारों पर लागू होता है।

दिलचस्प है (मैंने इसके बारे में नहीं सोचा था) एक varchar कॉलम की अधिकतम लंबाई utf8 से प्रभावित होती है:

MySQL 5.0.3 और बाद में VARCHAR की प्रभावी अधिकतम लंबाई अधिकतम पंक्ति आकार (65,535 बाइट्स, जो सभी स्तंभों के बीच साझा की गई है) और उपयोग किए गए वर्ण सेट के अधीन है। उदाहरण के लिए, utf8 वर्णों को प्रति वर्ण तीन बाइट्स की आवश्यकता हो सकती है, इसलिए एक VARCHAR स्तंभ जो utf8 वर्ण सेट का उपयोग करता है, उसे अधिकतम 21,844 वर्णों के रूप में घोषित किया जा सकता है।


48
एम ब्राउन, इस उल्लेख के लिए धन्यवाद। एक VARCHAR (10) फ़ील्ड (का उपयोग करके utf8mb4) "(" (10 बवासीर के पू) को स्टोर कर सकता है, यह 10 अक्षर है लेकिन 40 बाइट्स है।
बेसिक 6

3
यह। यह एकमात्र सही उत्तर है। बहुत से लोग संस्करण 4 व्यवहार को सुसमाचार के रूप में मानते हैं।
ब्रेंडन बर्ड

2
MySQL 5 के लिए स्वीकृत उत्तर भी सही है - सम्मिलित किए गए नंबर वास्तव में पूर्ण-चौड़ाई वाले चार सेट का हिस्सा थे और मल्टी-बाइट यूनिकोड वर्ण हैं, जैसा कि पोस्टर द्वारा उल्लेख किया गया है कि उन्होंने "32 मल्टीबाइट्स डेटा" डाला है। बहुत सारे लोगों को गलत समझा जाना शर्म की बात है।
user193130

निम्नलिखित स्रोत का हवाला देते हुए, मेरा मानना ​​है कि वर्तमान में 1 और 6 बाइट्स के बीच कहीं भी utf8 चरित्र को 6 बाइट्स की आवश्यकता होती है। यह एक पात्र के लिए सबसे खराब स्थिति का कारण बनता है जिसकी अधिकतम संख्या 10922 है। मुझे लगता है। joelonsoftware.com/articles/Unicode.html
usumoio

1
@usumoio वर्तमान में, ऐसा लगता है कि MySQL यूटीएफ -8 के 3-बाइट वेरिएंट का उपयोग करता है, (मानक) 4-बाइट वेरिएंट में माइग्रेशन के साथ: dev.mysql.com/doc/refman/8.0-en/charset-unicode -utf8.html
flow2k

8

यह आपको 32 बहु-बाइट वर्ण संग्रहीत करने देगा

UTF-8 के साथ स्थान बचाने के लिए, CHAR के बजाय VARCHAR का उपयोग करें। अन्यथा, MySQL को CHAR CHARACTER SET utf8 कॉलम में प्रत्येक वर्ण के लिए तीन बाइट्स आरक्षित करने चाहिए क्योंकि यह अधिकतम संभव लंबाई है। उदाहरण के लिए, MySQL को CHAR (10) CHARACTER SET utf8 कॉलम के लिए 30 बाइट्स आरक्षित करने होंगे।

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html


मैं लगभग कभी भी उपयोग नहीं CHARकरता हूं और जब मैं बहु-बाइट वर्णों को संग्रहीत करने का इरादा नहीं करता हूं, तो मैं सुरक्षित हूं। के बारे में क्या VARCHARआप सुनिश्चित हैं कि सीमा मल्टी-बाइट चार्ट में परिभाषित की गई है और सिंगल-बाइट चार्ट पर नहीं?
अलिक्स एक्सल

9
@jspcal: UTF-8 प्रति वर्ण अधिकतम 4 बाइट्स का उपयोग करता है, न कि 3. या MySQL सभी 4 बाइट्स का समर्थन नहीं करता है?
रेमी लेबेउ

5
@RemyLebeau आप utf8 के बारे में सही हैं, लेकिन MySQL के लिए नहीं। विभिन्न utf8_xxx वर्ण सेट 3-बाइट अधिकतम हैं। Utf8mb4_xxx 4 बाइट वर्ण लेता है। dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
बटल

समय की प्रगति के साथ, ऐसा लगता है कि MySQL आखिरकार मानक 4-बाइट संस्करण (लेकिन लेखन के समय अभी तक नहीं) का उपयोग करेगा: dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8 .html
flow2k

6

टकराव के varchar(32)साथ 32 मल्टीबाइट डेटा utf8_unicode_ci, मैंने अभी-अभी XAMPP के साथ परीक्षण किया है।

1234567890123456789012345678901234567890

इससे अलग हो जाएं:

12345678901234567890123456789012

ध्यान रखें कि ये नियमित ASCII वर्ण नहीं हैं।


4
UTF-8 मानक में ASCII वर्ण केवल एक ही बाइट में संग्रहीत किए जाएंगे - वास्तव में यह परीक्षण करने के लिए कि आपको वास्तव में अपने टेस्ट स्टिंग में कुछ मल्टीबाइट (यानी गैर-असिसी) वर्ण का उपयोग करने की आवश्यकता है।
rjmackay

5
यह गलत है, कम से कम MySQL 5+ के लिए। वर्चर या चार के लिए कॉलम आकार निर्दिष्ट करते समय, इसे वर्णों के संदर्भ में निर्दिष्ट किया जाता है। मेरा मानना ​​है कि VARCHAR (32) कॉलम का वास्तविक आकार 32x3 + 1 = 97 बाइट्स होगा।
बुटिक बटुक

5
@rjmackay '12345' मानक ASCII वर्ण नहीं हैं। en.wikipedia.org/wiki/…
एलेक्सी लेबेदेव

7
मैंने DB में 40 यूनिकोड वर्णों को सम्मिलित किया, और 32 वर्णों को काट दिया। लेकिन लगता है कि लोग सोचते हैं कि मैंने आस्की बाइट्स का इस्तेमाल किया और 32 बाइट्स काट लिए। कोई आश्चर्य नहीं, मैं उतर गया, योग्य।
आप

2
@ButtleButkus "मेरा मानना ​​है कि VARCHAR (32) कॉलम का वास्तविक आकार 32x3 + 1 = 97 बाइट्स होगा" यदि आप इसका उपयोग करेंगे utf8, लेकिन तब आपको MySQL में टूटा हुआ यूनिकोड समर्थन मिलेगा। आपको utf8mb4इसके बजाय एन्कोडिंग का उपयोग करना चाहिए , क्योंकि अधिकतम हैं। एक utf-8 char में 4 बाइट्स , MySQL के utf8 के वैरिएंट में 3 नहीं ...
Stijn de Witt

1

उच्च-लगातार अपडेट तालिकाओं के लिए "चार" का उपयोग करना बेहतर है क्योंकि पंक्ति की कुल डेटा लंबाई तय और तेज होगी। वर्कर कॉलम पंक्ति डेटा आकार को गतिशील बनाते हैं। यह MyISAM के लिए अच्छा नहीं है, लेकिन मैं InnoDB और अन्य के बारे में नहीं जानता। उदाहरण के लिए, यदि आपके पास बहुत संकीर्ण "प्रकार" कॉलम है, तो केवल न्यूनतम स्थान का दावा करने के लिए लेट 1 चार्ट के साथ चार्ट (2) का उपयोग करना बेहतर हो सकता है।


1
मैंने पढ़ा है कि यदि किसी तालिका में कोई भी स्तंभ varchar है, तो आप चार कॉलम होने के सभी लाभ खो देते हैं। मूल रूप से, ऐसा लगता है कि आपको अधिकतम लाभ के लिए एक तालिका में सभी varchar या सभी char के साथ जाना होगा। मुझे नहीं पता कि यह सच है, हालांकि।
बुटिक बटुक

MyISAM के लिए कुछ तर्क है CHAR। InnoDB के लिए, कई अन्य चीजें चल रही हैं कि "गतिशील / निश्चित पंक्ति आकार" बहस अनिवार्य रूप से अप्रासंगिक है।
रिक जेम्स

IMHO यहां महत्वपूर्ण बिंदु यह है कि बहुत छोटी लंबाई के लिए, इसका उपयोग करना फायदेमंद हो सकता है CHAR
टूलमेकरसैट

0

यदि आप एक MySQL UTF8 कॉलम में PHP UTF8 स्ट्रिंग को बचाने के लिए डेटाबेस से कनेक्ट करते हैं, तो आप LT1 एन्कोडिंग का उपयोग कर सकते हैं (उदाहरण के लिए PHP के साथ), आपके पास एक डबल UTF8 एन्कोडिंग होगा।

यदि UTF8 स्ट्रिंग $s32 अक्षर लंबा है, लेकिन 64 बाइट लंबा है और स्तंभ VARCHAR(32)UTF8 है, तो डबल एन्कोडिंग स्ट्रिंग $sको 64 वर्णों के लंबे UTF8 स्ट्रिंग में बदल देगा, जो कि डेटाबेस में उसके पहले 32 वर्णों के लिए पहले 32 बाइट्स के बराबर छोटा हो जाएगा। का है $s। आप यह सोचकर समाप्त हो सकते हैं कि MySQL 5 MySQL 4 की तरह व्यवहार करता है लेकिन यह वास्तव में उसी प्रभाव का दूसरा कारण है।

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