2012-03-15 13 views
36

डेटाबेस में छवियों को संग्रहीत करने की सामान्य विधि डेटा को संग्रहीत करने से पहले छवि को base64 डेटा में परिवर्तित करना है। यह प्रक्रिया आकार में 33% की वृद्धि करेगी। वैकल्पिक रूप से छवि को सीधे BLOB के रूप में संग्रहीत करना संभव है; उदाहरण के लिए:डेटाबेस में सीधे डेटा या बेस 64 डेटा के रूप में संग्रहीत करना?

$image = new Imagick("image.jpg"); 
$data = $image->getImageBlob(); 
$data = $mysqli->real_escape_string($data); 
$mysqli->query("INSERT INTO images (data) VALUES ('$data')"); 

और फिर

<img src="data:image/jpeg;base64,' . base64_encode($data) . '" /> 
बाद विधि के साथ

साथ छवि प्रदर्शित, हम 1/3 संग्रहण स्थान बचा। MySQL डेटाबेस में छवियों को base64 के रूप में स्टोर करना अधिक आम क्यों है?

अद्यतन: लाभों के बारे में कई बहस और डेटाबेस में छवियों को संग्रहीत करने का नुकसान कर रहे हैं, और ज्यादातर लोगों का मानना ​​है कि एक व्यावहारिक दृष्टिकोण नहीं है। वैसे भी, मुझे लगता है कि हम डेटाबेस में छवि स्टोर करते हैं, और ऐसा करने के लिए सबसे अच्छी विधि पर चर्चा करते हैं।

+5

तो क्यों base64 डेटा के रूप में फ़ाइल में डेटा एकत्र करने के लिए निर्णय लेने से एक फाइल करने के लिए डेटा सेव करें और डेटाबेस – Fredrik

+0

में केवल फ़ाइल स्थान या यूआरएल की दुकान @Fredrik? हम मूल छवि फ़ाइल को आसानी से सहेज सकते हैं। – Googlebot

+0

मुझे लगा कि आप इसे आईफोन या कुछ और डिवाइस से भेज रहे थे। फिर आप कच्चे डेटा को नहीं भेजना चाहते हैं लेकिन JSON में बेस 64 स्ट्रिंग या इसके बजाय कुछ नहीं चाहते हैं। – Fredrik

उत्तर

42

प्रो बेस 64: आपके द्वारा संभालित एन्कोडेड प्रतिनिधित्व एक सुंदर सुरक्षित स्ट्रिंग है। इसमें न तो नियंत्रण वर्ण और न ही उद्धरण शामिल हैं। बाद वाला बिंदु एसक्यूएल इंजेक्शन प्रयासों के खिलाफ मदद करता है। मैं किसी भी समस्या को "हाथ कोडित" SQL क्वेरी स्ट्रिंग में मान जोड़ने की अपेक्षा नहीं करता।

प्रो ब्लॉब: डेटाबेस प्रबंधक सॉफ़्टवेयर जानता है कि किस प्रकार के डेटा की अपेक्षा करनी है। यह इसके लिए अनुकूलित कर सकते हैं। यदि आप किसी टेक्स्ट फ़ील्ड में बेस 64 स्टोर करेंगे तो यह इसके लिए कुछ इंडेक्स या अन्य डेटा स्ट्रक्चर बनाने का प्रयास कर सकता है, जो "असली" टेक्स्ट डेटा के लिए वास्तव में अच्छा और उपयोगी होगा लेकिन व्यर्थ और छवि डेटा के लिए समय और स्थान की बर्बादी होगी। और यह बाइट्स, प्रतिनिधित्व की संख्या के रूप में छोटा है।

+0

very useful comparison. My worry is mainly about security. I am not sure if saving binary can open any security hole for SQL injection. – Googlebot

+0

That should depend on "proper" and "safe" handling of the data to the database. As I'm not familiar with PHP, what you seem to use, I can't give you tips on that. In java the tools I use (Hibernate/JPA) take care of that for me. :) – user1252434

+3

Escaping the input protects against SQL injection attacks, not the storage mechanism. I admit that I've never needed to enter an image by hand into a query. –

39

मेरा तर्क है कि छवियां (फ़ाइलें) आमतौर पर डेटाबेस बेस 64 एन्कोडेड में संग्रहीत नहीं होती हैं। इसके बजाय, वे अपने कच्चे बाइनरी रूप में बाइनरी (ब्लॉब) कॉलम (या फ़ाइल) में संग्रहीत होते हैं।

बेस 64 केवल परिवहन तंत्र के रूप में उपयोग किया जाता है, भंडारण के लिए नहीं। उदाहरण के लिए, आप एक बेस 64 एन्कोडेड छवि को किसी XML दस्तावेज़ या ईमेल संदेश में एम्बेड कर सकते हैं।

बेस 64 भी स्ट्रीम अनुकूल है। आप फ्लाई पर एन्कोड और डीकोड कर सकते हैं (डेटा के कुल आकार को जानने के बिना)।

जबकि बेस 64 परिवहन के लिए ठीक है, आपकी छवियों बेस 64 इनकोडिंग की दुकान नहीं है।

बेस 64 स्टोरेज के लिए कोई चेकसम या कोई भी मूल्य प्रदान नहीं करता है।

बेस 64 एन्कोडिंग कच्चे बाइनरी प्रारूप पर स्टोरेज आवश्यकता 33% बढ़ा देता है। यह लगातार भंडारण से पढ़ने वाले डेटा की मात्रा को भी बढ़ाता है, जो अभी भी कंप्यूटिंग में सबसे बड़ी बाधा है। यह आमतौर पर कम बाइट पढ़ने और फ्लाई पर एन्कोड करने के लिए तेज़ है। केवल अगर आपका सिस्टम आईओ बाध्य होने के बजाय सीपीयू बाध्य है, और आप नियमित रूप से बेस 64 में छवि को आउटपुट कर रहे हैं, तो बेस 64 में संग्रहीत करने पर विचार करें।

इनलाइन छवियों (बेस 64 इनकोडिंग छवियों HTML में भी अंतःस्थापित) एक टोंटी खुद को कर रहे हैं - आप तार पर 33% अधिक डेटा भेजने, और यह क्रमानुसार कर (वेब ​​ब्राउज़र से पहले यह कर सकते हैं इनलाइन चित्र पर इंतजार करना पड़ता है पेज एचटीएमएल डाउनलोड करना खत्म करें)।

यदि आप अभी भी छवियों को बेस 64 एन्कोड करना चाहते हैं, तो कृपया जो कुछ भी आप करते हैं, सुनिश्चित करें कि आप यूटीएफ 8 कॉलम में बेस 64 एन्कोडेड डेटा स्टोर नहीं करते हैं, फिर इसे इंडेक्स करें।

+2

अच्छी स्पष्टीकरण; लेकिन यदि आप खोज करते हैं, तो आपको बेस 64 और बाइनरी स्टोरेज के लिए कुछ स्टोर करने के लिए कई ट्यूटोरियल मिलेंगे। – Googlebot

+1

बेस 64 भंडारण के लिए कोई चेकसम या कोई भी मूल्य प्रदान नहीं करता है। यदि आप स्टोरेज के रूप में इसके उपयोग के लिए एक तर्क प्रदान करते हैं, तो मैं इसे आपके लिए डिबंक कर दूंगा। :) –

+2

@MarcusAdams बेस 64 का उपयोग कर उपयोगकर्ता अवतार छवियों को संग्रहीत करने के बारे में कैसे? मैं बेस 64/कच्चे के माध्यम से पीछे और आगे अनुवाद क्यों करना चाहूंगा जब मैं केवल एक बार एन्कोड कर सकता हूं और इसे भूल सकता हूं? –

0

मैं आधुनिक डेटाबेस जैसे नोएसक्यूएल को देखने की सलाह देता हूं और मैं उपयोगकर्ता 1252434 की पोस्ट से सहमत हूं। उदाहरण के लिए, मैं अपने मोंगो डीबी पर बेस 64 के रूप में कुछ < 500 केबी पीएनजी स्टोर कर रहा हूं, जिसमें बाइनरी सेट सही प्रदर्शन नहीं हुआ है। मोंगो का उपयोग 10 एमबी वीडियो जैसी बड़ी फाइलों को स्टोर करने के लिए किया जा सकता है और यह उन वीडियो के मेटाडेटा खोजों में भारी समय बचाने के फायदे प्रदान कर सकता है, storing large objects and files in mongodb देखें।

+0

मैं जो बीएसएन स्पेक में बैठ रहा हूं, उससे मोंगो डीबी तब बाइट एरे स्टोर करता है जो आधार 64-एन्कोडेड नहीं है, बल्कि कच्चे बाइट्स के रूप में, उनकी लंबाई के साथ उपसर्ग किया जाता है। – Volker

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