TL;DR
TEXT
- 65535 वर्णों का निश्चित अधिकतम आकार (आप अधिकतम आकार को सीमित नहीं कर सकते)
- 2 +
c
लेता है डिस्क स्थान के बाइट्स, जहांc
संग्रहीत स्ट्रिंग की लंबाई है। - सूचकांक का (पूरी तरह से) भाग नहीं हो सकता। किसी को एक उपसर्ग लंबाई निर्दिष्ट करने की आवश्यकता होगी।
VARCHAR(M)
- चर का अधिकतम आकार
M
वर्ण M
1 और 65535 के बीच होना चाहिए- 1 +
c
लेता है बाइट्स (M
. के लिए) 255) या 2 +c
(256 ≤ के लिएM
65535) डिस्क स्थान के बाइट्स जहांc
संग्रहीत स्ट्रिंग की लंबाई है - सूचकांक का हिस्सा हो सकता है
अधिक विवरण
TEXT
एक निश्चित . है 2¹⁶-1 = 65535
. का अधिकतम आकार अक्षर।VARCHAR
एक चर . है अधिकतम आकार M
तक M = 2¹⁶-1
.
इसलिए आप TEXT
. का आकार नहीं चुन सकते लेकिन आप VARCHAR
. के लिए कर सकते हैं ।
दूसरा अंतर यह है कि आप TEXT
पर एक इंडेक्स (पूर्ण टेक्स्ट इंडेक्स को छोड़कर) नहीं डाल सकते हैं। कॉलम।
इसलिए यदि आप कॉलम पर एक इंडेक्स रखना चाहते हैं, तो आपको VARCHAR
का उपयोग करना होगा। . लेकिन ध्यान दें कि एक इंडेक्स की लंबाई भी सीमित होती है, इसलिए यदि आपका VARCHAR
कॉलम बहुत लंबा है आपको VARCHAR
. के केवल पहले कुछ वर्णों का उपयोग करना होगा अपनी अनुक्रमणिका में कॉलम (CREATE INDEX
)।
लेकिन आप VARCHAR
. का भी उपयोग करना चाहते हैं , यदि आप जानते हैं कि संभावित इनपुट स्ट्रिंग की अधिकतम लंबाई केवल M
है , जैसे एक फोन नंबर या एक नाम या ऐसा कुछ। फिर आप VARCHAR(30)
. का उपयोग कर सकते हैं TINYTEXT
. के बजाय या TEXT
और अगर कोई आपके फोन नंबर कॉलम में तीनों "लॉर्ड ऑफ द रिंग" किताबों के टेक्स्ट को सेव करने की कोशिश करता है तो आप केवल पहले 30 अक्षरों को ही स्टोर करते हैं :)
संपादित करें: यदि आप डेटाबेस में जिस टेक्स्ट को स्टोर करना चाहते हैं, वह 65535 वर्णों से अधिक लंबा है, तो आपको MEDIUMTEXT
चुनना होगा। या LONGTEXT
, लेकिन सावधान रहें:MEDIUMTEXT
स्ट्रिंग्स को 16 एमबी तक स्टोर करता है, LONGTEXT
4 जीबी तक। यदि आप LONGTEXT
. का उपयोग करते हैं और PHP के माध्यम से डेटा प्राप्त करें (कम से कम यदि आप mysqli
. का उपयोग करते हैं बिना store_result
. के ), आपको स्मृति आवंटन त्रुटि मिल सकती है, क्योंकि PHP यह सुनिश्चित करने के लिए 4 जीबी मेमोरी आवंटित करने का प्रयास करता है कि पूरी स्ट्रिंग को बफर किया जा सकता है। यह शायद PHP के अलावा अन्य भाषाओं में भी होता है।
हालांकि, आपको हमेशा . चाहिए इनपुट की जांच करें (क्या यह बहुत लंबा है? क्या इसमें अजीब कोड है?) पहले इसे डेटाबेस में संग्रहीत करना।
सूचना:दोनों प्रकार के लिए, आवश्यक डिस्क स्थान केवल संग्रहीत स्ट्रिंग की लंबाई पर निर्भर करता है न कि अधिकतम लंबाई पर।
उदा. यदि आप वर्णसेट latin1 का उपयोग करते हैं और "टेस्ट" टेक्स्ट को VARCHAR(30)
में स्टोर करते हैं , VARCHAR(100)
और TINYTEXT
, इसे हमेशा 5 बाइट्स (स्ट्रिंग की लंबाई को स्टोर करने के लिए 1 बाइट और प्रत्येक वर्ण के लिए 1 बाइट) की आवश्यकता होती है। अगर आप उसी टेक्स्ट को VARCHAR(2000)
. में स्टोर करते हैं या एक TEXT
कॉलम, इसके लिए भी समान स्थान की आवश्यकता होगी, लेकिन, इस मामले में, यह 6 बाइट्स (स्ट्रिंग लंबाई को स्टोर करने के लिए 2 बाइट्स और प्रत्येक वर्ण के लिए 1 बाइट) होगा।
अधिक जानकारी के लिए दस्तावेज देखें। ।
अंत में, मैं एक नोटिस जोड़ना चाहता हूं, कि दोनों, TEXT
और VARCHAR
वेरिएबल लंबाई डेटा प्रकार हैं, और इसलिए वे डेटा को स्टोर करने के लिए आवश्यक स्थान को कम करने की संभावना रखते हैं। लेकिन यह प्रदर्शन के लिए ट्रेड-ऑफ के साथ आता है। यदि आपको बेहतर प्रदर्शन की आवश्यकता है, तो आपको एक निश्चित लंबाई प्रकार का उपयोग करना होगा जैसे CHAR
. आप इसके बारे में अधिक पढ़ सकते हैं यहां
।