2009-08-11 13 views
23

संभव डुप्लिकेट:
Are there disadvantages to using a generic varchar(255) for all text-based fields?MySQL: VARCHAR (255) के बजाय VARCHAR (20) का उपयोग क्यों करें?

MySQL में आप VARCHAR फ़ील्ड प्रकार के लिए लंबाई चुन सकते हैं। संभावित मान 1-255 हैं।

लेकिन यदि आप VARCHAR (205) के बजाय अधिकतम VARCHAR (255) का उपयोग करते हैं तो इसका क्या फायदे हैं? जहां तक ​​मुझे पता है, प्रविष्टियों का आकार केवल सम्मिलित स्ट्रिंग की वास्तविक लंबाई पर निर्भर करता है।

आकार (बाइट्स) = लंबाई + 1

तो अगर आप एक VARCHAR (255) क्षेत्र में शब्द "उदाहरण" है, यह 8 बाइट्स होगा। यदि आपके पास VARCHAR (20) फ़ील्ड में है, तो इसमें 8 बाइट भी होंगे। अंतर क्या है?

मुझे आशा है कि आप मेरी मदद कर सकते हैं। अग्रिम में धन्यवाद!

उत्तर

24

की जाँच करें: Reference for Varchar

संक्षेप में वहाँ बहुत अंतर जब तक आप अपने VARCHAR में 255 के आकार जो लंबाई उपसर्ग के लिए एक और बाइट की आवश्यकता होगी से अधिक नहीं है।

लंबाई किसी अन्य चीज़ की तुलना में कॉलम में संग्रहीत डेटा पर एक बाधा का संकेत देती है। यह मूल रूप से कॉलम के लिए अधिकतम संग्रहण आकार को भी सीमित करता है। आईएमएचओ, डेटा के संबंध में लंबाई को समझना चाहिए। यदि आपका सोशल सिक्योरिटी स्टोर करना # यह लंबाई को 128 तक सेट करने का कोई मतलब नहीं है, भले ही आपको स्टोरेज में कुछ भी खर्च न हो, यदि आप वास्तव में स्टोर करते हैं तो एसएसएन है।

1

अच्छा, अगर आप बड़ी प्रविष्टि की अनुमति देना चाहते हैं, या शायद प्रवेश आकार को सीमित कर सकते हैं।

उदाहरण के लिए, आपके पास पहले_नाम VARCHAR 20 के रूप में हो सकता है, लेकिन शायद 20 से VARCHAR 50 के रूप में street_address पर्याप्त स्थान नहीं हो सकता है। साथ ही, आप यह नियंत्रित करना चाहेंगे कि वह मान कितना बड़ा हो सकता है।

दूसरे शब्दों में, आपने तालिका को रोकने के लिए सिद्धांत में (और संभावित रूप से इंडेक्स/इंडेक्स प्रविष्टियों) को रोकने के लिए सिद्धांत में एक विशेष मूल्य कितना बड़ा हो सकता है, इसकी एक छत निर्धारित की है।

तुम बस CHAR जो एक निश्चित चौड़ाई के रूप में अच्छी तरह से है इस्तेमाल कर सकते हैं, लेकिन VARCHAR विपरीत छोटा हो सकता है, CHAR मूल्यों पैड (हालांकि यह जल्दी एसक्यूएल उपयोग करने के लिए बनाता है।

+0

लेकिन मुझे लंबाई 20 तक क्यों सेट करनी चाहिए? यदि कोई फर्क नहीं पड़ता है, तो मैं इसे सभी क्षेत्रों के लिए 255 पर सेट कर सकता हूं, है ना? – caw

+0

मेरा संपादन देखें - मैं थोड़ा और विस्तार करता हूं। – OneNerd

+0

धन्यवाद। तो यह भंडारण और प्रदर्शन converning कोई अंतर नहीं करता है, है ना? लेकिन यह उपयोगी हो सकता है, हालांकि, उदा। यदि आप लंबे समय तक रोकने के लिए तारों को काटना चाहते हैं। लेकिन अगर आप PHP में substr() या किसी अन्य भाषा में एक समान फ़ंक्शन का उपयोग करते हैं, तो आप इसे पहले भी प्राप्त कर सकते हैं !? – caw

1

एक डेटाबेस परिप्रेक्ष्य प्रदर्शन से बुद्धिमान मैं करता हूँ विश्वास नहीं है कि एक अंतर होने जा रहा है।

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

+1

"ध्यान दें कि CHAR का उपयोग केवल आपके एक्सेस को तेज़ कर देगा यदि पूरा रिकॉर्ड निश्चित आकार है। यानी, यदि आप किसी भी चर आकार के ऑब्जेक्ट का उपयोग करते हैं, तो आप उन्हें सभी वैरिएबल आकार भी बना सकते हैं। आपको चार्ज का उपयोग करके कोई गति नहीं मिलती एक सारणी में जिसमें एक वचरर भी शामिल है। " [लिंक] (http://dev.mysql.com/doc/refman/5.0/en/char.html) –

16

अधिकतम अधिकतम से अधिक मूल्य चुनने के कई वैध कारण हैं ई प्रदर्शन से संबंधित नहीं है। आकार निर्धारित करना आपके द्वारा संग्रहीत डेटा के प्रकार को इंगित करने में सहायता करता है और यह सत्यापन के अंतिम-गैस प्रकार के रूप में भी कार्य कर सकता है।

उदाहरण के लिए, यदि आप यूके पोस्टकोड संग्रहीत कर रहे हैं तो आपको केवल 8 वर्णों की आवश्यकता है। इस सीमा को सेट करने से आपके द्वारा संग्रहीत डेटा के प्रकार को स्पष्ट करने में मदद मिलती है। यदि आपने 255 वर्णों का चयन किया है तो यह केवल मामलों को भ्रमित करेगा।

+1

+1 स्पष्टता और समझदारी पर जोर देने के लिए। मैं निश्चित रूप से एक बफ [1024], एक 'नया डायनामिकबफ (1024)' या एक वर्चर (255) स्टोर करने के लिए सवाल करता हूं, उदाहरण के लिए, एक एकल, बिंदीदार-क्वाड आईपी पता। क्या कोडर को पता था कि वह क्या कर रहा था? – pilcrow

+4

+1 और यदि आप यूके पोस्टकोड के लिए VARCHAR (8) पर निर्णय लेते हैं तो प्रदर्शन के लिए CHAR (8) का उपयोग करें :) –

+1

यदि आप 8 वर्ण पोस्टकोड स्टोर करना चाहते हैं, तो आपको इसके बजाय CHAR (8) का उपयोग करना चाहिए। तालिका में VARCHAR कॉलम की उपस्थिति से बचने के लिए बेहतर है, क्योंकि यह varibale पंक्ति लंबाई और तालिका में धीमी तलाश को मजबूर करता है। हालांकि, अगर आपके पास निश्चित लंबाई के सभी कॉलम नहीं हो सकते हैं, तो यह महत्वपूर्ण नहीं है। –

1

एक अर्थपूर्ण अंतर है (और मुझे विश्वास है कि यह एकमात्र अंतर है): यदि आप 30 गैर-स्पेस वर्णों को वर्चर (20) में भरने का प्रयास करते हैं, तो यह एक त्रुटि उत्पन्न करेगा, जबकि यह वर्चर (255) के लिए सफल होगा । तो यह मुख्य रूप से एक अतिरिक्त बाधा है।

+0

लेकिन यह स्पष्ट नहीं है कि 30 वर्ण 20-बाइट फ़ील्ड में फिट न हों? – caw

+2

जैसा कि आप कहते हैं, स्टोरेज प्रस्तुति वास्तव में लंबाई की परवाह नहीं करती है: एक क्षेत्र घोषित वर्चर (20) बस 30 वर्णों को ठीक से स्टोर कर सकता है, जहां तक ​​डिस्क का प्रतिनिधित्व होता है - मैंने सोचा कि यह अवलोकन आपके प्रश्न का मूल था (क्यों हमेशा वर्कर (255) का उपयोग नहीं करते?) अब, मैं आपको कारण बता रहा हूं कि आपने वर्कर (20) क्यों सेट किया है: क्योंकि आप * त्रुटि * चाहते हैं जो आपको मिलती है यदि आप गलती से 20 से अधिक वर्णों को डालने का प्रयास करते हैं। –

+0

तो यह केवल सत्यापन मुद्दों के लिए है, सही? – caw

5

मुझे mySQL के बारे में पता नहीं है लेकिन SQL सर्वर में यह आपको फ़ील्ड को परिभाषित करने देगा ताकि उपयोग किए गए बाइट्स की कुल संख्या बाइट्स की कुल संख्या से अधिक हो जो वास्तव में रिकॉर्ड में संग्रहीत हो सके। यह बुरी बात है। जल्द या बाद में आपको एक पंक्ति मिलेगी जहां सीमा तक पहुंच गई है और आप डेटा सम्मिलित नहीं कर सकते हैं।

पंक्ति आकार सीमाओं पर विचार करने के लिए अपनी डेटाबेस संरचना को डिजाइन करना कहीं बेहतर है।

इसके अतिरिक्त हां, आप नहीं चाहते हैं कि लोग उस क्षेत्र में 200 अक्षर डालें जहां अधिकतम मान 10 होना चाहिए। यदि वे करते हैं, तो यह लगभग हमेशा खराब डेटा होता है।

आप कहते हैं, ठीक है, मैं इसे एप्लिकेशन स्तर पर सीमित कर सकता हूं। लेकिन डेटा सिर्फ एक आवेदन से डेटाबेस में नहीं मिलता है। कभी-कभी कई अनुप्रयोग इसका उपयोग करते हैं, कभी-कभी डेटा आयात किया जाता है और कभी-कभी इसे क्वेरी विंडो से मैन्युअल रूप से ठीक किया जाता है (उदाहरण के लिए कीमत में 10% जोड़ने के लिए सभी रिकॉर्ड्स अपडेट करें)। यदि डेटा के इन अन्य स्रोतों में से कोई भी आपके आवेदन में आपके द्वारा डाले गए नियमों के बारे में नहीं जानता है, तो आपके डेटाबेस में खराब, बेकार डेटा होगा। डेटाबेस अखंडता को डेटाबेस स्तर पर लागू किया जाना चाहिए (जो आपको डेटा दर्ज करने से पहले जांचने से रोकता नहीं है) या आपके पास कोई अखंडता नहीं है। इसके अलावा यह मेरा अनुभव रहा है कि जो लोग अपने डेटाबेस को डिजाइन करने के लिए बहुत आलसी हैं, वे वास्तव में आवेदन में सीमाएं डालने के लिए भी आलसी होते हैं और कोई डेटा अखंडता जांच नहीं होती है।

उनके पास डेटाबेस के लिए कोई शब्द नहीं है, जिसमें डेटा अखंडता नहीं है - बेकार।

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