2012-09-25 26 views
6

का उपयोग किये बिना प्रदर्शन चौड़ाई निर्दिष्ट क्यों करें मैंने हाल ही में SQL की रोमांचक दुनिया में पहुंचा दिया है। मैं अभी भी अवधारणाओं के चारों ओर अपने सिर लपेटने की कोशिश कर रहा हूँ। मैं ऑनलाइन ट्यूटोरियल का पालन कर रहा हूँ। इनमें से कई ट्यूटोरियल में इस तरह की टेबल बनाने के लिए SQL शामिल है।MySQL: ज़ीरोफिल

CREATE TABLE `users` (
    `id` tinyint(4) NOT NULL AUTO_INCREMENT, 
    `username` varchar(10) NOT NULL, 
    `password` varchar(100) NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

id tinyint(4) तरह लाइनों को देखने के बाद मैं क्या पैरामीटर डेटा प्रकार के लिए पारित सोचा। मैंने सोचा "क्या इसका मतलब आईडी -128 और 127 (4 वर्णों से अधिक नहीं) के बीच कोई पूर्णांक हो सकता है?"

इसलिए मैंने दस्तावेज़ों से परामर्श लिया। यह MySQL docs have to say about number type attributes है।

प्रदर्शन चौड़ाई कॉलम में संग्रहीत मानों की सीमा को बाधित नहीं करती है। न ही यह सही ढंग से प्रदर्शित होने से कॉलम प्रदर्शन चौड़ाई से अधिक मूल्यों को रोकता है। उदाहरण के लिए, एक कॉलम SMALLINT के रूप में निर्दिष्ट (3) 32767 करने के लिए -32768 के सामान्य SMALLINT रेंज है, और सीमा तीन अंकों द्वारा अनुमति के बाहर मूल्यों जब में इस्तेमाल किया और अधिक से अधिक तीन अंक

का उपयोग कर पूर्ण रूप से प्रदर्शित किए जाते हैं वैकल्पिक (गैर-मानक) विशेषता जेरोफिल के साथ संयोजन, रिक्त स्थान के डिफ़ॉल्ट पैडिंग को शून्य के साथ बदल दिया गया है। उदाहरण के लिए, एक कॉलम के लिए के रूप में INT (4) ZEROFILL, के रूप में 0005.

तो अगर मैं यह अधिकार पढ़ रहा हूँ, INT(255) तरह बातें की घोषणा बेकार हैं लिया गया है 5 के एक मूल्य की घोषणा की जब तक आप उपयोग कर रहे हैं खाली करना। ठीक है समझ में आता है कि डेटाबेस को डेटाटाइप घोषित करने के लिए डेटाबेस उस डेटाबेस के लिए पर्याप्त स्थान आवंटित करता है।

तो लोग इस तरह कोड क्यों लिखते हैं? क्या यह एक उद्देश्य प्रदान करता है? क्या मैं पूरी तरह से गलतफहमी कर रहा हूं?

+1

मुझे नहीं पता कि लोग इस तरह कोड क्यों लिखते हैं। यह निश्चित रूप से किसी भी उद्देश्य की सेवा नहीं करता है और बहुत सी गलतफहमी की जड़ है (यदि आप मुझसे पूछें तो MySQL में एक और खराब डिजाइन विकल्प) –

उत्तर

10

यह अतिरिक्त "फीचर" डिस्प्ले चौड़ाई काफी भ्रमित है, क्योंकि CHAR जैसे अन्य कॉलम प्रकारों में लंबाई निर्दिष्ट होती है।

  • सबसे महत्वपूर्ण:

    यहाँ एक छोटी टूटने है यह नहीं "भंडारण स्थान" या "अंकों की संख्या" निर्दिष्ट है। यह सिर्फ यह कह रहा है कि इस कॉलम में डेटा स्वरूपित होने से पहले स्वरूपित किया गया है। INT (5) समान INT (16) या INT (255) जैसे मानों को स्टोर कर सकता है - ये तीन तीन (और केवल) मानों को स्टोर कर सकते हैं जो INT के लिए मान्य हैं। आईएनटी (255) 255 अंकों के साथ एक नंबर स्टोर नहीं कर सकता है। उन सभी के लिए भंडारण स्थान एक आईएनटी है।

  • यदि आप प्रदर्शन चौड़ाई वाले कॉलम पर ZEROFILL का उपयोग करते हैं, और संग्रहित संख्या का स्ट्रिंग प्रस्तुति प्रदर्शन चौड़ाई से छोटा है, तो यह शून्य के साथ बाएं-गद्देदार होगा। यदि यह लंबा है, तो कुछ भी नहीं होता है। यदि आप INT (5) चुनते हैं और मान 13 है, तो इसे 00013 के रूप में वापस कर दिया जाएगा। यदि मान 123456 है तो इसे 123456 के रूप में वापस कर दिया जाएगा।
  • यदि आप ZEROFILL का उपयोग नहीं करते हैं, तो कोई भी पैडिंग नहीं होगा (कोई रिक्त स्थान है और इस तरह)
  • आप ZEROFILL उपयोग करते हैं, जैसा कि आप जानते होना चाहिए कि स्तंभ भी हो जाएगा UNSIGNED
  • किसी भी मामले में, प्रदर्शन चौड़ाई जब तालिका मेटा डेटा क्वेरी की जाती है लौटाया जाता है। इसलिए एक एप्लिकेशन यह जान सकता था कि डेटा को प्रारूपित किया जाना चाहिए।

मैं प्रदर्शन चौड़ाई को नापसंद करता हूं, क्योंकि भंडारण परत संग्रहीत डेटा की दृश्य प्रस्तुति के बारे में "जानना" है। इसके अलावा, ऐसा कोई उपयोग नहीं है जिसे मैं जानता हूं।