2010-12-12 8 views
44

MySQL के अनुसार, text कॉलम में 65,535 बाइट हैं।एक MySQL "टेक्स्ट" फ़ील्ड में कितना यूटीएफ -8 टेक्स्ट फिट बैठता है?

तो यदि यह एक वैध सीमा है तो क्या यह वास्तव में केवल 32k यूटीएफ -8 अक्षरों के लिए फिट होगा, है ना? या यह उन "अस्पष्ट" सीमाओं में से एक है जहां डॉक्स लिखने वाले लोग बाइट्स से वर्ण नहीं बता सकते हैं और यह वास्तव में utf8_general_ci जैसे कुछ पर सेट होने पर ~ 64k यूटीएफ -8 वर्णों को अनुमति देगा?

+5

आपकी आंखों के लिए संक्षिप्त उत्तर: यह बहुत ---> http://pastebin.com/eYUPppw6 (21844 3-बाइट यूटीएफ -8 वर्ण) – Sharky

उत्तर

70

text कॉलम 65,535 बाइट तक हो सकता है।

एक utf-8 चरित्र 3 बाइट तक हो सकता है।

तो ... आपकी वास्तविक सीमा 21,844 वर्ण हो सकती है। http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

एक चर लंबाई स्ट्रिंग:

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

+6

4 बाइट्स, नहीं 3: http://en.wikipedia.org/विकी/यूटीएफ -8 –

+2

एक यूटीएफ -8 चार 4 बाइट तक हो सकता है, और अंततः 5 या उससे अधिक हो सकता है, एक बार जब सभी एक्स्ट्रागैलेक्टिक कैरेक्टर सेट यूनिकोड में जोड़े जाते हैं: ^) –

+0

आपको यह कहां मिलता है "3 तक बाइट्स "आकृति? कोड बिंदु के यूटीएफ -8 का एन्कोडिंग 1 से 4 बाइट्स से कहीं भी उपयोग कर सकता है। – Thanatos

11

यूटीएफ -8 वर्ण प्रत्येक 4 बाइट तक ले सकते हैं, 2 जैसा कि आप सोच रहे हैं। UTF-8 is a variable-width encoding, यूनिकोड कोड बिंदु में महत्वपूर्ण बिट की संख्या के आधार: यूनिकोड कोड बिंदु में

  • 7 बिट और के तहत: UTF-8
  • 8 करने के लिए 11 बिट्स में 1 बाइट: UTF- में 2 बाइट्स 8
  • 12 16 बिट: 3 बाइट्स
  • 17 से 21 बिट्स: 4 बाइट्स

original UTF-8 spec 31-बिट यूनिकोड मान एन्कोडिंग, UTF- में एन्कोड करने के लिए के रूप में कई के रूप में 6 बाइट्स लेने की अनुमति देता है 8 फॉर्म यूटीएफ -8 लोकप्रिय होने के बाद, यूनिकोड कंसोर्टियम ने घोषणा की कि वे कभी भी 2 और thinsp; - & thinsp; 1 से परे कोड बिंदुओं का उपयोग नहीं करेंगे। अब यह RFC 3629 के रूप में मानकीकृत है।

MySQL currently (यानी संस्करण 5.6) केवल यूनिकोड Basic Multilingual Plane वर्णों का समर्थन करता है, जिसके लिए यूटीएफ -8 प्रति चरित्र 3 बाइट्स की आवश्यकता होती है। इसका मतलब है कि आपके प्रश्न का वर्तमान उत्तर यह है कि आपके TEXT फ़ील्ड में कम से कम 21,844 वर्ण हो सकते हैं।

आप इसे कैसे देखते पर निर्भर करता है

, वास्तविक सीमा अधिक या कि तुलना में कम हैं:

  • आप मान, के रूप में मैं करता हूँ, कि बीएमपी सीमा अंत में या में से एक MySQL में हटाया जाएगा, जब itsforks, आपको उस क्षेत्र में 16,383 से अधिक वर्णों को स्टोर करने में सक्षम होने पर भरोसा नहीं करना चाहिए यदि आपका MySQL क्लाइंट मनमाने ढंग से यूनिकोड टेक्स्ट इनपुट की अनुमति देता है।

  • दूसरी तरफ, आप इस तथ्य का फायदा उठाने में सक्षम हो सकते हैं कि यूटीएफ -8 एक चर चौड़ाई एन्कोडिंग है। यदि आप जानते हैं कि आपका टेक्स्ट अधिकतर कभी-कभी गैर-एएससीआईआई चरित्र के साथ सादा अंग्रेजी है, तो आपकी प्रभावी इन-प्रैक्टिस सीमा अधिकतम 64 और थिंसेप तक पहुंच सकती है; केबी और थिंसे; - और थिंसर; 1 वर्ण सीमा।

+0

"केवल यह मान सकता है कि क्षेत्र यूटीएफ -8 पाठ के 16 के * अक्षर * तक हो सकता है।" ← मैं स्पष्ट करता हूं कि ... – Thanatos

+0

फिक्स्ड। धन्यवाद, थानाटोस। –

1

हालांकि, जब के रूप में प्राथमिक कुंजी इस्तेमाल किया, MySQL मानता है कि स्तंभ के आकार के प्रत्येक सीमा कुंजी को 3 बाइट्स कहते हैं।

mysql> alter table test2 modify code varchar(333) character set utf8; 
Query OK, 0 rows affected (0.05 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> alter table test2 modify code varchar(334) character set utf8; 
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 

खैर, लंबी स्ट्रिंग स्तंभों का उपयोग के रूप में प्राथमिक कुंजी आम तौर पर एक बिस्तर अभ्यास है, लेकिन मुझे लगता है कि समस्या का सामना करना है जब एक वाणिज्यिक (!) उत्पाद के डेटाबेस के साथ काम करने के लिए आया था गए हैं।

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