Data Biner di MySQL [ditutup]

186

Bagaimana cara menyimpan data biner di MySQL ?

Geoff Dalgas
sumber
2
@Nevir: Informasi apa yang Anda cari secara khusus? Apa yang Anda rasakan kurang dari jawaban @ phpguy dan @ Mat ?
eggyal
Maaf, saya tidak bermaksud memberi hadiah ini (menabrak bug UI dengan SO), tetapi tidak dapat menghapus hadiah
Nevir
Anda harus dapat menghapus hadiah
Akshay Giri FR

Jawaban:

138

Jawaban oleh phpguy benar tetapi saya pikir ada banyak kebingungan dalam detail tambahan di sana.

Jawaban dasarnya adalah dalam BLOBtipe data / atribut domain. BLOB adalah kependekan dari Binary Large Object dan tipe data kolom itu khusus untuk menangani data biner.

Lihat halaman manual yang relevan untuk MySQL .

Tikar
sumber
57

Untuk tabel seperti ini:

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)
);

Berikut ini adalah contoh 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>
mauris
sumber
9
Kode ini terlihat seperti PHP3 (atau mungkin 4), yang register_globals diaktifkan. Anda tidak ingin menjalankan kode ini, dan itu juga tidak akan berfungsi pada instalasi PHP semi-up to date (yang merupakan versi 5).
Hingga
26
-1 untuk addlashes () di mana mysql_real_escape_string () diperlukan. Bisakah kita berhenti memberikan kode orang dengan kerentanan injeksi SQL di dalamnya? (Tidak, addlashes () TIDAK cukup baik.)
chaos
40

Saya sangat merekomendasikan untuk tidak menyimpan data biner dalam basis data relasional. Database relasional dirancang untuk bekerja dengan data ukuran tetap; di situlah kekuatan kinerja mereka: ingat artikel lama Joel tentang mengapa database begitu cepat? karena dibutuhkan tepat peningkatan 1 pointer untuk berpindah dari satu record ke record lainnya. Jika Anda menambahkan data BLOB dengan ukuran yang tidak terdefinisi dan sangat bervariasi, Anda akan mengacaukan kinerja.

Sebagai gantinya, simpan file dalam sistem file, dan simpan nama file dalam database Anda.

Alex Weinstein
sumber
11
Saya tidak mengundurkan diri, tetapi mungkin karena dia menyiratkan bahwa Anda tidak boleh melakukannya, sebagai lawan dari mengatakan itu adalah ide yang buruk sebagian besar waktu. Saya setuju dengannya secara umum, tetapi tidak dalam 100% kasus. Mungkin ada pertimbangan selain kinerja. Misalnya saya sedang mengerjakan sesuatu sekarang di mana kinerja tidak penting sama sekali. Faktor-faktor lain seperti sentralisasi, kesederhanaan dan cadangan berarti bahwa dalam hal ini menyimpan dalam database masuk akal. Alasan umum lainnya adalah replikasi.
LaVache
4
Di sisi lain menyimpan data dalam db adalah OS independen, yang dapat bagus untuk nama file yang aneh. db dapat menyimpan banyak file dengan nama file yang sama, OS tidak bisa. Tidak ada masalah baca / tulis / hapus. Tidak perlu sistem cadangan tambahan. Dan, itu bukan untuk umum. Jadi terkadang perkembangannya cepat. Btw. tidak ada yang memaksa Anda untuk menyimpan semuanya dalam database yang sama, pada akhirnya semuanya berakhir pada disk.
Joeri
7
@AlexWeinstein, Anda membingungkan data biner dengan data lebar tetap. Data biner dapat diperbaiki lebar juga. Dan data lebar tetap tidak baik untuk semua situasi. Memang, dalam banyak situasi Anda akan mendapat manfaat dari data lebar variabel: baca paragraf terakhir dari dev.mysql.com/doc/refman/5.5/id/charset-unicode-utf8mb4.html
Pacerier
4
Setuju dengan @Pacerier untuk hal ini, BINARY (16) disimpan tetap. Adapun BLOB: BLOB memiliki pointer lebar tetap ke data yang disimpan di luar tabel. Itu tidak seperti varchar atau varbinary yang menyimpannya secara inline. Mencari gumpalan membutuhkan beberapa langkah ekstra, tetapi tinggalkan di klausa WHERE Anda dan itu baik-baik saja.
Garr Godfrey
4
Saya juga berpikir menyimpan file di sistem file sangat rusak dan non-portabel. bagaimana jika file tersebut dihapus?
Garr Godfrey
22

Walaupun Anda belum mengatakan apa yang Anda simpan, dan Anda mungkin memiliki alasan yang bagus untuk melakukannya, seringkali jawabannya adalah 'sebagai referensi sistem file' dan data aktual ada di sistem file di suatu tempat.

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

Issac Kelly
sumber
17

Itu tergantung pada data yang ingin Anda simpan. Contoh di atas menggunakan LONGBLOBtipe data, tetapi Anda harus menyadari bahwa ada format data biner lainnya:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Masing-masing memiliki kasing masing-masing. Jika diketahui panjang (pendek) (mis. Data yang dikemas) sering kali BINARYatau VARBINARYakan bekerja. Mereka memiliki manfaat tambahan karena dapat melakukan indeks pada mereka.

d0nut
sumber
14

Meskipun seharusnya tidak perlu, Anda dapat mencoba base64menyandikan data dan mendekodekannya. Itu berarti db hanya akan memiliki karakter ascii. Ini akan membutuhkan sedikit lebih banyak ruang dan waktu, tetapi masalah apa pun yang berkaitan dengan data biner akan dihilangkan.

pengguna10117
sumber
11

Jika bidang - tidak disarankan - BLOB ada, Anda dapat menyimpan data dengan cara ini:

mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");

Ide diambil dari sini .

Komunitas
sumber
10

Muncul juga pertanyaan bagaimana cara memasukkan data ke BLOB. Anda bisa memasukkan data dalam pernyataan INSERT, seperti yang ditunjukkan oleh contoh PHP (meskipun Anda harus menggunakan mysql_real_escape_string alih-alih addlash). Jika file ada di server database, Anda juga dapat menggunakan LOAD_FILE MySQL

Scott Noyes
sumber
Tautan itu mengatakan, bahwa MySQL_real_escape_string sudah usang.
Poul Bak