মাইএসকিউএল-এ বাইনারি ডেটা [বন্ধ]


186

আমি মাইএসকিউএলে বাইনারি ডেটা কীভাবে সঞ্চয় করব ?



2
@ নেভির: আপনি বিশেষত কোন তথ্য পরে আছেন? @ Phpguy এবং @ মাদুরের উত্তরগুলি থেকে আপনি কী অভাব বোধ করছেন ?
উদ্বিগ্ন

দুঃখিত, আমি এটি অনুগ্রহ করার অর্থ চাইনি (এসও এর সাথে একটি ইউআই বাগে চলে এসেছি), তবে
অনুগ্রহটি

আপনি যদি একটি খয়রাত অপসারণ করতে সক্ষম হওয়া উচিত
অক্ষয় গিরি এফ আর

উত্তর:


138

পিএইচপিগুইয়ের উত্তরটি সঠিক তবে আমি মনে করি সেখানে অতিরিক্ত বিবরণে অনেক বিভ্রান্তি রয়েছে।

প্রাথমিক উত্তরটি BLOBডেটা টাইপ / বৈশিষ্ট্যযুক্ত ডোমেনে। BLOB বাইনারি লার্জ অবজেক্টের জন্য সংক্ষিপ্ত এবং সেই কলামের ডেটা টাইপ বাইনারি ডেটা পরিচালনা করার জন্য নির্দিষ্ট।

মাইএসকিউএলের জন্য প্রাসঙ্গিক ম্যানুয়াল পৃষ্ঠাটি দেখুন ।


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
    // 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
এই কোডটি পিএইচপি 3 (বা সম্ভবত 4) এর মতো দেখায়, যা রেজিস্টার_গ্লোবালগুলি সক্ষম করে। আপনি এই কোডটি চালাতে চান না, এবং এটি পিএইচপি ইনস্টলেশন (যা সংস্করণ 5 হ'ল) ​​একটি সেমি আপ টু ডেট কাজ করবে না।
পর্যন্ত

26
অ্যাডল্যাশেস () এর জন্য যেখানে মাইএসকিএল_রিয়াল_সেস্কেপ_স্ট্রিং () প্রয়োজন। আমরা কি দয়া করে এর মধ্যে এসকিউএল ইঞ্জেকশন দুর্বলতার সাথে লোকেদের কোড দেওয়া বন্ধ করতে পারি? (না, অ্যাডল্যাশগুলি () যথেষ্ট ভাল নয়))
বিশৃঙ্খলা

40

আমি একটি আপেক্ষিক ডাটাবেসে বাইনারি ডেটা সংরক্ষণের বিরুদ্ধে দৃ strongly়ভাবে প্রস্তাব দিই । সম্পর্কিত সম্পর্কিত ডাটাবেসগুলি স্থির আকারের ডেটা দিয়ে কাজ করার জন্য ডিজাইন করা হয়েছে; তাদের পারফরম্যান্সের শক্তিটি এখানে: জোয়েলের পুরানো নিবন্ধটি মনে রাখবেন ডেটাবেসগুলি এত দ্রুত কেন ? কারণ রেকর্ড থেকে অন্য রেকর্ডে যেতে ঠিক 1 পয়েন্টার বর্ধন লাগে। আপনি যদি অপরিশোধিত এবং বিস্তৃত আকারের বিএলওবি ডেটা যুক্ত করেন তবে আপনি কার্য সম্পাদন করবেন।

পরিবর্তে ফাইল সিস্টেমে ফাইল সঞ্চয় করুন এবং আপনার ডাটাবেসে ফাইলের নাম সংরক্ষণ করুন।


11
আমি উঁচুতে যাই নি, তবে এটি সম্ভবত এটি খারাপ ধারণার বেশিরভাগ সময় খারাপ ধারণা বলার বিপরীতে এই ইঙ্গিত দিয়েছিল যে আপনার এটি করা উচিত নয়। আমি সাধারণত তার সাথে একমত, তবে 100% ক্ষেত্রে নয়। পারফরম্যান্স ছাড়াও অন্যান্য বিবেচনা থাকতে পারে। উদাহরণস্বরূপ, আমি এখন এমন কিছু নিয়ে কাজ করছি যেখানে পারফরম্যান্স মোটেও গুরুত্বপূর্ণ নয়। কেন্দ্রিয়করণ, সরলতা এবং ব্যাকআপগুলির মতো অন্যান্য কারণের অর্থ এই ক্ষেত্রে ডাটাবেসে সংরক্ষণ করার অর্থ রয়েছে। আর একটি সাধারণ কারণ হ'ল প্রতিলিপি।
লাভাচে

4
অন্যদিকে ডিবিতে ডেটা সংরক্ষণের জন্য ওএস স্বাধীন, যা অদ্ভুত ফাইল নামগুলির জন্য দুর্দান্ত হতে পারে। ডিবি একই ফাইল নাম সহ একাধিক ফাইল সঞ্চয় করতে পারে, ওএস পারে না। এটিতে কোনও পঠন / লেখার / মুছার সমস্যা নেই। এটির জন্য অতিরিক্ত ব্যাকআপ সিস্টেমের প্রয়োজন নেই। এবং, এটি সর্বজনীন নয়। তাই কখনও কখনও এটি বিকাশে দ্রুত হয়। BTW। কেউ আপনাকে একই ডাটাবেসে সমস্ত কিছু সঞ্চয় করতে বাধ্য করছে না, শেষ পর্যন্ত এটি সমস্ত ডিস্কে শেষ হয়।
জোয়ারি

7
@ অ্যালেক্সওইনস্টাইন, আপনি স্থির প্রস্থের ডেটা সহ বাইনারি ডেটা বিভ্রান্ত করছেন। বাইনারি ডেটা পাশাপাশি প্রস্থ নির্দিষ্ট করা যেতে পারে। এবং নির্দিষ্ট প্রস্থের ডেটা সব পরিস্থিতিতে ভাল নয়। প্রকৃতপক্ষে, অনেক পরিস্থিতিতে আপনি পরিবর্তনশীল প্রস্থের ডেটা থেকে উপকৃত হবেন: dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
প্যাসিয়ার

4
এতে @ পেসারিয়ার সাথে একমত হোন, বিনারি (16) স্থির করে রাখা হয়েছে। বিএলওবি হিসাবে: একটি বিএলবিওর টেবিলের বাইরে সঞ্চিত ডেটাতে একটি নির্দিষ্ট প্রস্থ পয়েন্টার রয়েছে। এটি ভারচার বা ভেরিবিনির থেকে পৃথক যা এটি ইনলাইন সংরক্ষণ করে a ব্লব অনুসন্ধান করার জন্য কিছু অতিরিক্ত পদক্ষেপ প্রয়োজন, তবে এটি আপনার WHWEE ধারা থেকে ছেড়ে দিন এবং এটি ঠিক আছে।
গার গডফ্রে

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ডেটা এনকোডিং এবং এটিকে ডিকোড করার চেষ্টা করতে পারেন। তার মানে ডিবিতে কেবল আসকি অক্ষর থাকবে। এতে আরও কিছুটা জায়গা এবং সময় লাগবে, তবে বাইনারি ডেটার সাথে করা যে কোনও সমস্যা মুছে ফেলা হবে।



10

প্রশ্নটি উত্থাপিত হয় কীভাবে বিএলএব-তে ডেটা পাবেন। আপনি ডেটা একটি INSERT বিবৃতিতে রাখতে পারেন, যেমন পিএইচপি উদাহরণটি দেখায় (যদিও আপনার অ্যাডল্যাশগুলির পরিবর্তে mysql_real_escape_string ব্যবহার করা উচিত )। ফাইলটি ডাটাবেস সার্ভারে উপস্থিত থাকলে আপনি মাইএসকিউএল এর LOAD_FILE ব্যবহার করতে পারেন


এই লিঙ্কটি বলে, MySQL_real_escape_string হ্রাস করা হয়েছে।
পৌল বাক

10

আমার যখন বাইনারি ডেটা সংরক্ষণ করার দরকার হয় তখন আমি সর্বদা VARBINARYফর্ম্যাট ব্যবহার করি , যেমনটি চালু করা হয়েছিল byd0nut

আপনি নথিভুক্ত বিষয়ের অধীনে মাইএসকিউএল ওয়েবসাইটে ডকুমেন্টেশন সন্ধান করতে পারেন 12.4.2 বারাইন এবং ভারবিনারি প্রকারসমূহ

আপনি যদি সুবিধাজনক কি তা জিজ্ঞাসা করছেন তবে দয়া করে কেন বার্চারের পরিবর্তে-বর্ণের প্রশ্নটি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.