MySQL'deki İkili Veriler [kapalı]


187

İkili verileri MySQL'de nasıl saklarım ?



2
@Nevir: Hangi bilgileri özellikle takip ediyorsunuz? @ Phpguy ve @ Mat'ın cevaplarından ne hissediyorsunuz ?
eggyal

Maalesef, bunu ödüllendirmek istemedim (SO ile bir UI hatasına rastladım), ancak ödülü kaldıramıyorum
Nevir

bir lütuf kaldırmak gerekir
Akshay Giri FR

Yanıtlar:


138

Phpguy tarafından cevap doğru ama orada ek ayrıntılar çok karışıklık olduğunu düşünüyorum.

Temel cevap bir BLOBveri tipi / özellik alanındadır. BLOB , İkili Büyük kısaltmasıdır ve bu sütun veri türü, ikili verilerin işlenmesine özgüdür.

MySQL için ilgili kılavuz sayfasına bakınız .


57

Bunun gibi bir tablo için:

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

İşte bir PHP örneği:

<?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
Bu kod, register_globals'ın etkinleştirildiği PHP3'e (veya belki 4'e) benzer. Bu kodu çalıştırmak istemezsiniz ve aynı zamanda yarı güncel bir PHP kurulumunda (sürüm 5) çalışmaz.
Till

26
Mysql_real_escape_string () gereken addslashes () için -1. Lütfen SQL enjeksiyon güvenlik açıklarına sahip kodları vermeyi bırakabilir miyiz? (Hayır, addslashes () yeterince iyi DEĞİL.)
kaos

40

Şiddetle tavsiye karşı bir ilişkisel veritabanı ikili veri depolamak. İlişkisel veritabanları sabit boyutlu verilerle çalışmak üzere tasarlanmıştır; performans güçlerinin olduğu yer: Joel'in veritabanlarının neden bu kadar hızlı olduğuna dair eski makalesini hatırlayın ? çünkü bir kayıttan başka bir kayda geçmek tam olarak 1 işaretçi artışı gerektirir. Tanımsız ve büyük ölçüde değişen boyutta BLOB verileri eklerseniz, performansı düşürürsünüz.

Bunun yerine, dosyaları dosya sisteminde depolayın ve dosya adlarını veritabanınızda saklayın.


11
Ben aşağı inmedim, ama çoğu zaman kötü bir fikir olduğunu söylemenin aksine, ASLA bunu yapmamanız gerektiğini ima etmesinden kaynaklanıyor olabilir. Genel olarak ona katılıyorum, ancak vakaların% 100'ünde değil. Performans dışında dikkat edilmesi gereken noktalar olabilir. Mesela şimdi performansın hiç önemli olmadığı bir şey üzerinde çalışıyorum. Merkezileştirme, basitlik ve yedekleme gibi diğer faktörler, bu durumda veritabanında depolamanın mantıklı olduğu anlamına gelir. Bir başka yaygın neden de çoğaltmadır.
LaVache

4
Öte yandan db'de veri depolamak OS'den bağımsızdır, bu da garip dosya adları için iyi olabilir. db aynı dosya adına sahip birden fazla dosya depolayabilir, işletim sistemi yapamaz. Okuma / yazma / silme sorunu yoktur. Ek bir yedekleme sistemine ihtiyaç duymaz. Ve halka açık değil. Bu yüzden bazen geliştirme hızlıdır. Btw. kimse sizi her şeyi aynı veritabanında depolamaya zorlamaz, sonunda her şey bir diskte biter.
Joeri

7
@AlexWeinstein, İkili verileri sabit genişlik verileriyle karıştırıyorsunuz. İkili veriler de sabit genişlikli olabilir. Sabit genişlikli veriler tüm durumlar için iyi değildir. Gerçekten de, birçok durumda değişken genişlik verilerinden faydalanırsınız: dev.mysql.com/doc/refman/5.5/tr/charset-unicode-utf8mb4.html
Pacerier 18:14

4
Bu konuda @Pacerier ile hemfikir olun, BINARY (16) sabit olarak saklanır. BLOB'a gelince: Bir BLOB, tablonun dışında saklanan verilere sabit bir genişlik işaretçisine sahiptir. Bu, satır içi depolayan varchar veya varbinary'den farklıdır.Bir blob araştırmak için bazı ek adımlar gerektirir, ancak WHERE yan tümcesinizden dışarıda bırakın ve sorun yoktur.
Garr Godfrey

4
Ayrıca dosya sisteminde dosya depolamak çok kırık ve taşınabilir olmayan düşünüyorum. dosya silinirse ne olur?
Garr Godfrey


17

Saklamak istediğiniz verilere bağlıdır. Yukarıdaki örnek LONGBLOBveri türünü kullanır , ancak başka ikili veri formatları olduğunu bilmeniz gerekir:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Her birinin kullanım durumları vardır. Bilinen (kısa) bir uzunluk (örneğin paketlenmiş veri) ise sık sık BINARYveya VARBINARYçalışır. Onlar üzerinde ton endeksi olma avantajı var.


14

Gerekli olmamakla birlikte, base64verileri içeri kodlamayı ve deşifre etmeyi deneyebilirsiniz . Bu, db'nin sadece ascii karakterleri olacağı anlamına gelir. Biraz daha fazla yer ve zaman alacaktır, ancak ikili verilerle ilgili herhangi bir sorun ortadan kaldırılacaktır.


11

- Önerilmez - BLOB alanı varsa, verileri şu şekilde kaydedebilirsiniz:

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

Fikir buradan alındı .


10

Soru ayrıca verilerin BLOB'a nasıl girileceğidir. PHP örneğinin gösterdiği gibi bir INSERT deyimine veri koyabilirsiniz (her ne kadar addslashes yerine mysql_real_escape_string kullanmalısınız). Dosya veritabanı sunucusunda varsa, MySQL'in LOAD_FILE dosyasını da kullanabilirsiniz


Bu bağlantı MySQL_real_escape_string'in kullanımdan kaldırıldığını söylüyor.
Poul Bak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.