MySQL में बाइनरी डेटा [बंद]


186

मैं MySQL में बाइनरी डेटा कैसे स्टोर करूं ?


1
stor

2
@ नववीर: आप विशेष रूप से किस सूचना के बाद हैं? आपको क्या लगता है @ phpguy's और @ Mat के जवाबों की कमी है?

क्षमा करें, मेरा यह मतलब नहीं था कि यह (एसओ के साथ यूआई बग में चला गया), लेकिन इनाम को नहीं हटा सकते
नेविर

आपको एक इनाम निकालने में सक्षम होना चाहिए
अक्षय गिरी FR

जवाबों:


138

Phpguy द्वारा उत्तर सही है, लेकिन मुझे लगता है कि अतिरिक्त विवरणों में बहुत भ्रम है।

मूल उत्तर BLOBडेटा प्रकार / विशेषता डोमेन में है। बीएलओबी बाइनरी लार्ज ऑब्जेक्ट के लिए छोटा है और बाइनरी डेटा से निपटने के लिए कॉलम डेटा प्रकार विशिष्ट है।

MySQL के लिए प्रासंगिक मैनुअल पेज देखें ।


57

इस तरह एक मेज के लिए:

CREATE TABLE binary_data (
    id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    description CHAR(50),
    bin_data LONGBLOB,
    filename CHAR(50),
    filesize CHAR(50),
    filetype CHAR(50)
);

यहाँ एक PHP उदाहरण है:

<?php
    // store.php3 - by Florian Dittmer <dittmer@gmx.net>
    // Example php script to demonstrate the storing of binary files into
    // an sql database. More information can be found at http://www.phpbuilder.com/
?>

<html>
    <head><title>Store binary data into SQL Database</title></head>

    <body>
        <?php
            // Code that will be executed if the form has been submitted:

            if ($submit) {
                // Connect to the database (you may have to adjust
                // the hostname, username or password).

                mysql_connect("localhost", "root", "password");
                mysql_select_db("binary_data");

                $data = mysql_real_escape_string(fread(fopen($form_data, "r"), filesize($form_data)));

                $result = mysql_query("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) ".
                                    "VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')");

                $id= mysql_insert_id();
                print "<p>This file has the following Database ID: <b>$id</b>";

                mysql_close();
            } else {

                // else show the form to submit new data:
        ?>
        <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
            File Description:<br>
            <input type="text" name="form_description"  size="40">
            <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
            <br>File to upload/store in database:<br>
            <input type="file" name="form_data"  size="40">
            <p><input type="submit" name="submit" value="submit">
        </form>

        <?php
            }
        ?>
    </body>
</html>

9
यह कोड PHP3 (या शायद 4) जैसा दिखता है, जो register_globals को सक्षम करता है। आप इस कोड को नहीं चलाना चाहते हैं, और यह PHP इंस्टॉलेशन (जो कि संस्करण 5 है) के अर्ध तक काम नहीं करेगा।
तक

26
Addlashes के लिए -1 () जहाँ mysql_real_escape_string () की आवश्यकता है। क्या हम कृपया इसमें SQL इंजेक्शन भेद्यता वाले लोगों को कोड देना बंद कर सकते हैं? (नहीं, अतिरिक्त (बहुत अच्छा नहीं है।)
अराजकता

40

मैं रिलेशनल डेटाबेस में बाइनरी डेटा स्टोर करने के खिलाफ दृढ़ता से सलाह देता हूं । संबंधपरक डेटाबेस को निश्चित आकार के डेटा के साथ काम करने के लिए डिज़ाइन किया गया है; यही कारण है कि उनके प्रदर्शन की ताकत है: जोएल के पुराने लेख को याद रखें कि डेटाबेस इतने तेज़ क्यों हैं? क्योंकि यह एक रिकॉर्ड से दूसरे रिकॉर्ड में जाने के लिए ठीक 1 पॉइंटर इन्क्रीमेंट लेता है। यदि आप अपरिभाषित और अत्यधिक भिन्न आकार के BLOB डेटा जोड़ते हैं, तो आप प्रदर्शन को बढ़ा देंगे।

इसके बजाय, फ़ाइल सिस्टम में फ़ाइलों को संग्रहीत करें, और अपने डेटाबेस में फ़ाइल नामों को संग्रहीत करें।


11
मैंने इसे कम नहीं किया, लेकिन इसका कारण यह हो सकता है कि आपको ऐसा करना चाहिए, जैसा कि यह कहना है कि यह सबसे खराब विचार है। मैं उसके साथ आम तौर पर सहमत हूं, लेकिन 100% मामलों में नहीं। प्रदर्शन के अलावा अन्य विचार भी हो सकते हैं। उदाहरण के लिए मैं अब कुछ काम कर रहा हूं, जहां प्रदर्शन बिल्कुल भी मायने नहीं रखता। केंद्रीयकरण, सादगी और बैकअप जैसे अन्य कारकों का मतलब है कि इस मामले में डेटाबेस में भंडारण करना समझ में आता है। एक और सामान्य कारण प्रतिकृति है।
लावाचे

4
दूसरी ओर db में डेटा स्टोर करना OS स्वतंत्र है, जो अजीब फ़ाइलनाम के लिए अच्छा हो सकता है। DB एक ही फ़ाइल नाम के साथ कई फ़ाइलों को संग्रहीत कर सकता है, OS नहीं कर सकता। इसमें कोई रीड / राइट / इश्यू नहीं है। इसके लिए अतिरिक्त बैकअप सिस्टम की जरूरत नहीं है। और, यह सार्वजनिक नहीं है। इसलिए कभी-कभी यह विकास में तेज होता है। Btw। कोई भी आपको एक ही डेटाबेस में सब कुछ स्टोर करने के लिए मजबूर नहीं कर रहा है, अंत में यह सब एक डिस्क पर समाप्त होता है।
जोरी

7
@AlexWeinstein, आप निश्चित चौड़ाई के डेटा के साथ द्विआधारी डेटा को भ्रमित कर रहे हैं। बाइनरी डेटा के रूप में अच्छी तरह से तय की जा सकती है। और निश्चित चौड़ाई डेटा सभी स्थितियों के लिए अच्छा नहीं है। वास्तव में, कई स्थितियों में आपको चर चौड़ाई डेटा से लाभ होगा: dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html के
Pacerier

4
इस पर @Pacerier के साथ सहमत, BINARY (16) को संग्रहीत किया जाता है। BLOB के लिए: एक BLOB में तालिका के बाहर संग्रहीत डेटा के लिए एक निश्चित चौड़ाई सूचक है। यह varchar या varbinary के विपरीत है जो इसे इनलाइन स्टोर करता है। एक बूँद की खोज करने के लिए कुछ अतिरिक्त चरणों की आवश्यकता होती है, लेकिन इसे अपने WHERE क्लॉज़ से बाहर छोड़ दें और यह ठीक है।
गैर गॉडफ्रे

4
मुझे भी लगता है कि फाइलसिस्टम में फाइल को स्टोर करना बहुत टूटा हुआ और गैर-पोर्टेबल है। क्या होगा अगर फाइल डिलीट हो जाए?
गैर गॉडफ्रे

22

जब आपने यह नहीं कहा कि आप क्या कर रहे हैं, और ऐसा करने के लिए आपके पास एक बड़ा कारण हो सकता है, तो अक्सर इसका जवाब 'फाइलसिस्टम संदर्भ के रूप में' होता है और वास्तविक डेटा कहीं न कहीं फाइल सिस्टम पर होता है।

http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html


17

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

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

प्रत्येक के उपयोग के मामले हैं। यदि यह एक ज्ञात (छोटी) लंबाई है (उदाहरण के लिए पैक डेटा) अक्सर बार BINARYया VARBINARYकाम करेगा। उन पर टन सूचकांक में सक्षम होने का अतिरिक्त लाभ है।


14

हालांकि यह आवश्यक नहीं होना चाहिए, आप base64डेटा को इनकोडिंग और इसे डिकोड करने का प्रयास कर सकते हैं। इसका मतलब है कि db में सिर्फ एससीआई अक्षर होंगे। यह थोड़ा अधिक स्थान और समय लेगा, लेकिन बाइनरी डेटा के साथ करने के लिए किसी भी मुद्दे को समाप्त कर दिया जाएगा।



10

प्रश्न यह भी उठता है कि डेटा को BLOB में कैसे लाया जाए। आप डेटा को INSERT स्टेटमेंट में डाल सकते हैं, जैसा कि PHP उदाहरण दिखाता है (हालाँकि आपको Addlashes के बजाय mysql_real_escape_string का उपयोग करना चाहिए )। यदि फ़ाइल डेटाबेस सर्वर पर मौजूद है, तो आप MySQL के LOAD_FILE का भी उपयोग कर सकते हैं


उस लिंक का कहना है, कि MySQL_real_escape_string पदावनत है।
पौल बक

10

जब मुझे बाइनरी डेटा स्टोर करने की आवश्यकता होती है VARBINARY, तो मैं हमेशा प्रारूप का उपयोग करता हूं , जैसा कि प्रस्तुत किया गया है byd0nut

आप दस्तावेज़ के विषय 12.4.2 के तहत MySQL वेबसाइट पर डॉक्यूमेंटेशन पा सकते हैं । BINARY और VARBINARY प्रकार

आप पूछ रहे हैं, तो क्या advantagese हैं, तो कृपया प्रश्न पर देखने क्यों-varbinary-बजाय के- varchar

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.