2013-09-27 9 views
6

स्टोर करने के लिए सर्वश्रेष्ठ MySQL डेटा प्रकार मेरे पास एक PHP अनुप्रयोग है जो सभी खातों को संग्रहीत करता है चाहे वे एक ही तालिका में सक्रिय हों या नहीं। तालिका में "सक्रिय" नामक एक कॉलम होता है जो या तो नल होता है जिसका अर्थ है कि खाता सक्रिय है, या इसमें MD5 हैश है जिसका अर्थ है कि खाता निष्क्रिय है।MD5 हैश या NULL

Best practices for efficiently storing md5 hashes in mysql के अनुसार, यदि कॉलम में हमेशा एमडी 5 हैश होता है और कभी नहीं होता है, तो बिनरी (16) को प्राथमिकता दी जाती है और CHAR (32) अगली सबसे अच्छी पसंद है। चूंकि मेरे अधिकांश खाते सक्रिय हैं और इस प्रकार अधिकांश स्तंभ मान शून्य होंगे, क्या मैं एक अलग डेटा प्रकार जैसे VARCHAR (32) का उपयोग करना बंद कर दूंगा?

+1

हाँ आप कर सकते हैं .. 'वचर (32)' बेहतर है। –

+0

संभवतः डुप्लिकेट [MySQL: हैश पासवर्ड क्षेत्र और किस लंबाई के लिए उपयोग करने के लिए डेटा प्रकार?] (Http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed- पासवर्ड-फ़ील्ड-और-क्या-लंबाई) –

उत्तर

12

VARCHAR का उपयोग करने का कोई मतलब नहीं है। एमडी 5 हैश हमेशा 128-बिट होते हैं, इसलिए एक CHAR (32) में हेक्स अंकों की स्ट्रिंग होती है, या बिनरी (16) में हेक्स अंकों के बाद बाइट्स की स्ट्रिंग होती है।

एनयूएलएल का उपयोग डेटा प्रकार की पसंद से स्वतंत्र है। MySQL स्ट्रिंग के बदले नल को स्टोर कर सकता है, या तो CHAR या VARCHAR। लेकिन वास्तव में, इनो डीबी के डिफ़ॉल्ट पंक्ति प्रारूप में, MySQL NULLs को बिल्कुल स्टोर नहीं करता है, यह कॉलम के लिए कुछ भी स्टोर नहीं करता है जो पूर्ण हैं।


संदर्भ: http://dev.mysql.com/doc/internals/en/innodb-field-contents.html

  • सहायक नोट्स NULLs के बारे में:

    तीसरी पंक्ति के लिए, मैं फ़ील्ड 2 और फ़ील्ड 3 में NULLs डाला। इसलिए फ़ील्ड स्टार्ट ऑफसेट्स में इन फ़ील्ड के लिए शीर्ष बिट चालू है (मान 94 हेक्साडेसिमल, 94 हेक्साडेसिमल, 14 हेक्साडेसिमल के बजाय, 14 हेक्साडेसिमल) हैं। और पंक्ति कम है क्योंकि NULLs कोई स्थान नहीं लेते हैं।

(जोर मेरा)

+0

धन्यवाद बिल, तो आपके उत्तर के आधार पर, मैं समझता हूं कि यदि मैं CHAR (32) या BINARY (16) का उपयोग करता हूं, और संग्रहित मान शून्य है, तो मेरा ओवरहेड बड़ा नहीं है VARCHAR (32) का उपयोग कर। धन्यवाद और मुझे आशा है कि आप सही हैं! – user1032531

+0

+1 विधेयक और @ उपयोगकर्ता 1032531 विधेयक का अर्थ है कि आपको चार्ज (32) या बिनरी (16) का उपयोग करना चाहिए। और हाँ जब आप VARCHAR का उपयोग करते हैं तो आपका ओवरहेड बड़ा होगा क्योंकि MySQL को आपके शर्चर कितने बड़े हैं, यह जानने के लिए अतिरिक्त दो शॉर्ट्स को सहेजने की आवश्यकता है।और जब आप ascii_bin charset को परिभाषित करते हैं तो सटीक लुकअप कुंजी को चर कॉलम पर तेज़ी से थॉरी में होना चाहिए। –

0

फ़ाइल स्ट्रिंग्स/ctype-bin.c में MySQL स्रोत कोड में BINARY प्रकार परिभाषित किया गया है।

यह डिफ़ॉल्ट सी एएससीआई आधारित वर्णमाला बाइनरी में परिवर्तित दिखता है। यह thoery तेज होना चाहिए तो CHAR (32) ascii_bin charset के साथ।

कम समय लिखने/द्विआधारी पढ़ने के लिए की जरूरत है और यह अनुक्रमित और स्मृति में कम डिस्क में जगह लेता है और क्योंकि क्योंकि CHAR (32) डेटाप्रकार 16 बाइट्स बड़ा

है आप इस का उपयोग करने के आप इस का उपयोग करना चाहिए चाहते हैं PHP कोड

<?php 
    md5 ("password", true); // true returns the binary what is 16 bytes long MySQl BINARY(16) 
?> 
-5

आप PHP समारोह md5 उपयोग कर सकते हैं(); अधिक कुशल है और यदि आप डेटाबेस पर भेजे जाने पर डेटा को पकड़ सकते हैं, तो वह पहले ही क्रिप्ट हो जाएगा।

+2

यह सवाल का उत्तर कैसे देता है? – mistika

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