TINYTEXT, TEXT, MEDIUMTEXT, और LONGTEXT अधिकतम संग्रहण आकार


796

प्रति MySQL डॉक्स , चार पाठ प्रकार हैं:

  1. TINYTEXT
  2. पाठ
  3. MEDIUMTEXT
  4. LongText

चरित्र एन्कोडिंग मानने वाले प्रत्येक डेटा प्रकार के एक कॉलम में अधिकतम लंबाई क्या है जिसे यूटीएफ -8 कहा जा सकता है?


26
उदाहरण के लिए TEXT टाइप करें। इसमें 65535 बाइट्स डेटा हो सकते हैं । UTF-8 में मल्टी-बाइट वर्ण होते हैं। इसलिए, यदि आपने केवल सत चरित्र "Ø" का उपयोग करके फ़ील्ड भर दिया है, तो आपको केवल 32767 वर्ण मिलेंगे, क्योंकि UTF-8 वर्ण दो बाइट्स से बना है। यदि आप इसे "ए" से भरते हैं, तो आपको 65535 अक्षर मिलेंगे।
एंड्रयू प्लैंक

जवाबों:


1517

से प्रलेखन :

      प्रकार | अधिकतम लंबाई
----------- + -------------------------------------
  TINYTEXT | 255 (2 8 )1) बाइट्स
      पाठ | 65,535 (2 16 )1) बाइट्स = 64 कीबी
MEDIUMTEXT | 16,777,215 (2 24 771 ) बाइट्स = 16 MiB
  LONGTEXT | 4,294,967,295 (2 32 by1 ) बाइट्स = 4 GiB

ध्यान दें कि आपके कॉलम में संग्रहीत किए जाने वाले वर्णों की संख्या वर्ण एन्कोडिंग पर निर्भर करेगी ।


3
@Bridge यकीन है कि मुझे समझ में नहीं आया, लेकिन इसका मतलब यह है कि TINYTEXT 255 वर्णों तक मिल सकता है, क्या मैं सही हूं ???
प्रातः

9
@ लिकोस हाँ, अच्छी तरह से - पात्रों पर निर्भर करता है। प्रलेखन से: A TEXT column with a maximum length of 255 (28 – 1) characters. The effective maximum length is less if the value contains multi-byte characters.अधिक विस्तार के लिए अंकन का उत्तर देखें।
ब्रिज

4
@ aurel.g यह है कि आप वास्तव में सवाल का जवाब कैसे देते हैं। और मैं क्रिस्टोफ़ के साथ सहमत हूं, यह है कि कैसे mySQL को अपने मापदंडों को पेश करना चाहिए - भले ही उनके पूरक के रूप में एक आशुलिपि हो ... पुरालेख पाठ दृश्य।
cbmtrx

1
यह जोड़ने के लायक हो सकता है कि एक चरित्र के परिमाण का क्रम बाइट्स का एक जोड़ा है (न्यूनतम 1 मिनट मुझे लगता है)। तो एक TEXT कॉलम में कोई 10,000-50,000 अक्षर स्टोर कर सकता है, ...
Vince


245

उसी उत्तर का विस्तार

  1. यह एसओ ओवरहेड्स और स्टोरेज मैकेनिज्म को विस्तार से बताता है।
  2. जैसा कि बिंदु (1) से उल्लेख किया गया है, TINYTEXT के बजाय हमेशा एक VARCHAR का उपयोग किया जाना चाहिए। हालांकि, VARCHAR का उपयोग करते समय, अधिकतम पंक्तियों को 65535 बाइट्स से बाहर नहीं निकलना चाहिए।
  3. जैसा कि यहां बताया गया है http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html , utf-8 के लिए अधिकतम 3 बाइट्स।

यह एक बहुत बड़ा उदाहरण है जो त्वरित निर्णय के लिए है!

  1. तो सबसे खराब स्थिति मान्यताओं (3 बाइट्स प्रति utf-8 char) के लिए सबसे अच्छा मामला (1 बाइट प्रति utf-8 चार)
  2. अंग्रेजी भाषा की मानें तो प्रति शब्द औसतन 4.5 अक्षर हैं
  3. x आवंटित बाइट्स की संख्या है

xx

      Type | A= worst case (x/3) | B = best case (x) | words estimate (A/4.5) - (B/4.5)
-----------+---------------------------------------------------------------------------
  TINYTEXT |              85     | 255               | 18 - 56
      TEXT |          21,845     | 65,535            | 4,854.44 - 14,563.33  
MEDIUMTEXT |       5,592,415     | 16,777,215        | 1,242,758.8 - 3,728,270
  LONGTEXT |   1,431,655,765     | 4,294,967,295     | 318,145,725.5 - 954,437,176.6

कृपया क्रिस वी के जवाब को भी देखें: https://stackoverflow.com/a/35785869/1881812


4
इस के लिए तर्क क्या है "TINYTEXT के बजाय हमेशा एक VARCHAR का उपयोग किया जाना चाहिए"? क्या यह बेहतर होगा (क्योंकि अधिक स्टोरेज कुशल) छोटे TINYTEXT का उपयोग करने के लिए कभी-कभी?
vlasits

24
@vlasits विवरण के लिए शामिल SO पोस्ट पढ़ते हैं। (1) सभी पाठ प्रकार, जिसमें टिनीटेक्स्ट शामिल हैं, पंक्ति के बाहर की वस्तुओं के रूप में संग्रहीत किए जाते हैं जो एक ओवरहेड (2) है। इन वस्तुओं को फिर पते 8 या 16 बाइट्स द्वारा संदर्भित किया जाता है। कोई बात नहीं कितनी छोटी बात है, आप अनावश्यक ओवरहेड जोड़ रहे हैं, वह भी अधिकतम 255 बाइट्स के आकार के लिए। यह स्पष्ट है कि वार्चर का उपयोग किया जाना चाहिए, जो अभ्यस्त उपरोक्त ओवरहेड्स में से कोई भी है।
अंकन-ज़ेरोब

4
@ Ankan-Zerob यह देखते हुए कि यह स्पष्ट है कि TINYTEXT को VARCHAR पर कभी भी इस्तेमाल नहीं किया जाना चाहिए, विकल्प के रूप में भी इसके लिए तर्क क्या है? क्या कुछ अस्पष्ट उपयोग-मामला है जहां यह आवश्यक है?
नेक्स्टजेनटेक

4
@nextgentech पर dev.mysql.com/doc/refman/5.0/en/column-count-limit.html पर एक नज़र डालें । एक रिकॉर्ड आकार 64 KiB तक सीमित है। एक तालिका 4k कॉलम तक सीमित है। एक TINYTEXTमायने रखता है 1 बाइट + 8 रिकॉर्ड आकार के खिलाफ बाइट, जबकि एक VARCHAR(255)1 बाइट + 255 बाइट से 2 बाइट + 1020 बाइट (4 बाइट UTF-8 वर्णों) रिकॉर्ड आकार के खिलाफ करने के लिए मायने रखता है।
शि

2
मुझे शब्दों में फ़ील्ड आकार व्यक्त करना पसंद है, लेकिन ... आमतौर पर अंग्रेजी में लगभग 5 अक्षर प्रति शब्द माना जाता है, और संग्रहीत करने के लिए एक अंतरिक्ष वर्ण भी होता है; हालाँकि, अंग्रेजी हमेशा यूटीएफ -8 चरित्र के अनुसार 1 बाइट के करीब होगी, इसलिए मैं 6 को 40 / 10,000 / 2,700,000 / 710,000,000 शब्दों को विभिन्न आकारों के लिए दे कर विभाजित करूँगा। बहुत सारे उच्चारणों वाली भाषाओं जैसे पोलिश में थोड़े कम शब्द होंगे; ग्रीक, हिब्रू, अरबी, आदि (लगभग 2-बाइट अनुक्रम के साथ) लगभग आधा; सीजेके विचारधारा 3 या 4-बाइट अनुक्रम हैं, लेकिन मुझे नहीं पता कि शब्द कितने लंबे हैं।
क्रिस VV

44

@ Ankan-Zerob की चुनौती के लिए बढ़ती है, इस अधिकतम लंबाई जो प्रत्येक पाठ प्रकार में संग्रहित किया जा सकता की मेरी अनुमान है शब्दों में मापा :

      Type |         Bytes | English words | Multi-byte words
-----------+---------------+---------------+-----------------
  TINYTEXT |           255 |           ±44 |              ±23
      TEXT |        65,535 |       ±11,000 |           ±5,900
MEDIUMTEXT |    16,777,215 |    ±2,800,000 |       ±1,500,000
  LONGTEXT | 4,294,967,295 |  ±740,000,000 |     ±380,000,000

में अंग्रेजी , शब्द प्रति 4.8 पत्र शायद एक अच्छा औसत (जैसे है norvig.com/mayzner.html ), हालांकि शब्द लंबाई डोमेन के अनुसार अलग अलग होंगे (जैसे बोली जाने वाली भाषा बनाम शैक्षिक पेपर), इसलिए वहाँ कोई मतलब भी सटीक किया जा रहा है। अंग्रेजी ज्यादातर एकल-बाइट ASCII वर्ण है, जिसमें कभी-कभी बहु-बाइट वर्ण होते हैं, इसलिए एक-बाइट-प्रति-अक्षर के करीब। इंटर-वर्ड रिक्त स्थान के लिए एक अतिरिक्त चरित्र की अनुमति दी जानी है, इसलिए मैंने प्रति शब्द 5.8 बाइट्स से गोल किया है। बहुत से लहजे वाली भाषाएं जैसे कि कहती हैं कि पोलिश कुछ कम शब्दों को संग्रहीत करती है, जैसे कि जर्मन लंबे शब्दों के साथ।

की आवश्यकता होती है बोली मल्टी-बाइट ग्रीक, अरबी, हिब्रू, हिंदी, थाई, आदि, आदि के रूप में वर्ण आम तौर पर UTF-8 में चरित्र प्रति दो बाइट्स की आवश्यकता है। प्रति शब्द 5 अक्षरों पर बेतहाशा अनुमान लगाते हुए, मैंने प्रति शब्द 11 बाइट्स से गोल किया है।

सीजेके स्क्रिप्ट (हंजी, कांजी, हीरागाना, कटकाना, आदि) मुझे कुछ भी नहीं पता है; मेरा मानना ​​है कि वर्णों को अधिकतर UTF-8 में 3 बाइट्स की आवश्यकता होती है, और (बड़े सरलीकरण के साथ) उन्हें प्रति शब्द लगभग 2 वर्णों का उपयोग करने के लिए माना जा सकता है, इसलिए वे अन्य दो के बीच कहीं होंगे। (सीजेके लिपियों को यूटीएफ -16 का उपयोग करके कम भंडारण की आवश्यकता होती है, निर्भर करता है)।

यह निश्चित रूप से भंडारण ओवरहेड्स आदि की अनदेखी है।


CJK अक्षर 3 या 4 बाइट अनुक्रम का उपयोग कर सकते हैं: dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
रैप्टर

8

यह अच्छा है लेकिन सवाल का जवाब नहीं देता:

"TINYTEXT के बजाय हमेशा एक VARCHAR का उपयोग किया जाना चाहिए।" यदि आपके पास विस्तृत पंक्तियाँ हैं, तो टिनीटेक्स्ट उपयोगी है - क्योंकि डेटा रिकॉर्ड से संग्रहीत होता है। एक प्रदर्शन ओवरहेड है, लेकिन इसका उपयोग होता है।

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