Binaire gegevens in MySQL

stemmen
163

Hoe kan ik binaire gegevens op te slaan in MySQL ?

De vraag is gesteld op 01/08/2008 om 06:09
bron van user
In andere talen...                            


10 antwoorden

stemmen
128

Het antwoord van phpguy is correct, maar ik denk dat er veel verwarring in de aanvullende informatie daar.

De basis antwoord is in een BLOBdata-type / attribuut domein. BLOB is een afkorting voor Binary Large Object en dat kolomgegevenstype specifiek is voor het verwerken van binaire data.

Zie de betreffende handleiding voor MySQL .

antwoordde op 01/08/2008 om 13:16
bron van user

stemmen
54

Voor een tabel als volgt uit:

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

Hier is een PHP-voorbeeld:

<?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 IGNORE  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>
antwoordde op 01/08/2008 om 06:12
bron van user

stemmen
37

Ik adviseer sterk tegen het opslaan van binaire data in een relationele database. Relationele databases zijn ontworpen om te werken met vaste data; dat is waar hun prestaties kracht is: herinner me oude artikel Joel's over waarom databases zijn zo snel? want het duurt precies 1 pointer increment om van een record naar een ander record. Als u BLOB gegevens van ongedefinieerde en de sterk wisselende grootte toevoegt, zult u verknallen prestaties.

In plaats daarvan, bestanden opslaan in het bestandssysteem, en op te slaan bestandsnamen in uw database.

antwoordde op 17/09/2008 om 21:37
bron van user

stemmen
20

Terwijl u niet gezegd wat je te slaan, en je kan een goede reden om dit te doen hebben, is het antwoord vaak 'als een filesystem referentie' en de feitelijke gegevens over het bestandssysteem ergens.

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

antwoordde op 02/08/2008 om 15:57
bron van user

stemmen
16

Het hangt af van de gegevens die u wilt opslaan. Het bovenstaande voorbeeld gebruikt de LONGBLOBdata type, maar u dient zich ervan bewust dat er andere binaire data formaten:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Elk heeft zijn use cases. Als het een bekend (kort) lengte (bv verpakt gegevens) vaak BINARYof VARBINARYzal werken. Ze hebben het extra voordeel van de mogelijkheid ton index op hen.

antwoordde op 31/12/2010 om 02:04
bron van user

stemmen
13

Hoewel het niet nodig zou zijn, zou je kunnen proberen base64het coderen van gegevens in en decoderen van het uit. Dat betekent dat de db zal gewoon ASCII-tekens. Het zal een beetje meer ruimte en tijd, maar elk probleem te maken heeft met de binaire data zullen worden geëlimineerd nemen.

antwoordde op 16/09/2008 om 05:07
bron van user

stemmen
10

Als de - niet aan te raden - BLOB veld bestaat, kunt u gegevens op te slaan op deze manier:

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

Idee genomen van hier .

antwoordde op 12/09/2013 om 13:00
bron van user

stemmen
9

Toen ik nodig om binaire gegevens op te slaan Ik gebruik altijd VARBINARYformaat, zoals geïntroduceerd byd0nut.

U kunt de documentatie bij MySQL website vindt u onder gedocumenteerd onderwerp 12.4.2 De binaire en VARBINARY Types

Als je vraagt wat advantagese zijn, kijk dan op vraag waarom-varbinary-plaats-of-varchar

antwoordde op 01/05/2014 om 10:37
bron van user

stemmen
9

De vraag is ook hoe de gegevens op te halen in de BLOB. Je kan er je de gegevens in een INSERT IGNORE statement, als de PHP-voorbeeld laat zien (hoewel je moet gebruiken mysql_real_escape_string plaats van addslashes). Als het bestand bestaat op de database server, dan kunt u ook gebruik maken van MySQL's LOAD_FILE

antwoordde op 27/08/2008 om 16:13
bron van user

stemmen
8

Een veel betere uitvoering opslag in beschikbaar hier . U zult tegenkomen problemen met de implementatie Florian's.

antwoordde op 17/09/2008 om 10:53
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more