MyISAM तालिकाओं के लिए, NULL प्रत्येक पंक्ति के लिए प्रत्येक NULLABLE कॉलम (नल बिट) के लिए एक अतिरिक्त बिट बनाता है। यदि कॉलम NULLABLE नहीं है, तो अतिरिक्त जानकारी की कभी आवश्यकता नहीं होती है। हालाँकि, यह 8 बिट बाइट्स के लिए गद्देदार है, इसलिए आपको NULLABLE कॉलम की गिनती के लिए हमेशा 1 + मॉड 8 बाइट्स प्राप्त होते हैं। 1
टेक्स्ट कॉलम अन्य डेटाटाइप से थोड़े अलग हैं। सबसे पहले, "" के लिए तालिका प्रविष्टि में स्ट्रिंग की दो बाइट लंबाई होती है जिसके बाद स्ट्रिंग के बाइट्स होते हैं और यह एक भिन्न लंबाई संरचना होती है। NULL के मामले में, लंबाई की जानकारी की कोई आवश्यकता नहीं है, लेकिन यह वैसे भी कॉलम संरचना के हिस्से के रूप में शामिल है।
InnoDB में, NULLS कोई स्थान नहीं लेता है:वे बस डेटा सेट में मौजूद नहीं होते हैं। खाली स्ट्रिंग के लिए भी यही सच है क्योंकि डेटा ऑफ़सेट भी मौजूद नहीं है। अंतर केवल इतना है कि NULLs में NULL बिट सेट होगा जबकि खाली स्ट्रिंग्स नहीं होगी। 2
जब डेटा वास्तव में डिस्क पर रखा जाता है, तो NULL और '' दोनों डेटा प्रकारों में बिल्कुल समान स्थान लेते हैं। हालाँकि, जब मान की खोज की जाती है, तो NULL की जाँच करना थोड़ा तेज़ होता है और फिर '' की जाँच करना होता है क्योंकि आपको अपनी गणना में डेटा की लंबाई पर विचार करने की आवश्यकता नहीं होती है:आप केवल नल बिट की जाँच करते हैं।
NULL और '' स्पेस अंतर के परिणामस्वरूप, NULL और '' कोई आकार प्रभाव नहीं है जब तक कि कॉलम को न्यूलेबल या नहीं होने के लिए निर्दिष्ट किया गया हो। यदि कॉलम NULL नहीं है, तो केवल MyISAM तालिकाओं में आपको कोई प्रदर्शन अंतर दिखाई देगा (और फिर, जाहिर है, डिफ़ॉल्ट NULL का उपयोग नहीं किया जा सकता है, इसलिए यह एक विवादास्पद प्रश्न है)।
असली सवाल तब "यहां कोई मूल्य निर्धारित नहीं" कॉलम की एप्लिकेशन व्याख्या के लिए उबाल जाता है। यदि "" एक मान्य मान है जिसका अर्थ है "उपयोगकर्ता ने यहां कुछ भी दर्ज नहीं किया" या कुछ ऐसा, तो डिफ़ॉल्ट NULL बेहतर है क्योंकि आप NULL और "" के बीच अंतर करना चाहते हैं जब एक रिकॉर्ड दर्ज किया जाता है जिसमें कोई डेटा नहीं होता है।
आम तौर पर हालांकि, डिफॉल्ट वास्तव में केवल डेटाबेस को रीफैक्टर करने के लिए उपयोगी होता है, जब पुराने डेटा पर नए मानों को प्रभावी होने की आवश्यकता होती है। उस स्थिति में, फिर से, चुनाव इस बात पर निर्भर करता है कि एप्लिकेशन डेटा की व्याख्या कैसे की जाती है। कुछ पुराने डेटा के लिए, NULL पूरी तरह से उपयुक्त है और सबसे उपयुक्त है (कॉलम पहले मौजूद नहीं था इसलिए अब इसका NULL मान है!) दूसरों के लिए, "" अधिक उपयुक्त है (अक्सर जब क्वेरी SELECT * का उपयोग करती हैं और NULL क्रैश समस्याओं का कारण बनता है)।
अल्ट्रा-सामान्य शर्तों में (और एक दार्शनिक दृष्टिकोण से) NULLABLE कॉलम के लिए डिफ़ॉल्ट NULL को प्राथमिकता दी जाती है क्योंकि यह "कोई मान निर्दिष्ट नहीं" की सर्वोत्तम अर्थपूर्ण व्याख्या देता है।
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]