Vra

Hoe stoor ek binêre data in MySQL?

Was dit nuttig?

Oplossing

Die antwoord deur phpguy is korrek, maar ek dink daar is baie verwarring in die bykomende besonderhede daar.

Die basiese antwoord is in a BLOB datatipe/kenmerkdomein. BLOB is kort vir Binary Large Object en daardie kolomdatatipe is spesifiek vir die hantering van binêre data.

Sien die betrokke handleiding vir MySQL.

Ander wenke

Vir 'n tafel soos hierdie:

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 'n 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 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>

Ek beveel sterk aan teen die stoor van binêre data in 'n relasionele databasis.Relasionele databasisse is ontwerp om met vaste-grootte data te werk;dit is waar hul prestasiekrag is:onthou Joel se ou artikel oor hoekom databasisse so vinnig is?want dit neem presies 1 wyser inkrement om van 'n rekord na 'n ander rekord te beweeg.As jy BLOB-data van ongedefinieerde en baie wisselende grootte byvoeg, sal jy prestasie verswak.

Stoor eerder lêers in die lêerstelsel en stoor lêername in jou databasis.

Alhoewel jy nie gesê het wat jy stoor nie, en jy dalk 'n goeie rede het om dit te doen, is die antwoord dikwels 'as 'n lêerstelselverwysing' en is die werklike data iewers op die lêerstelsel.

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

Dit hang af van die data wat jy wil stoor.Die voorbeeld hierbo gebruik die LONGBLOB datatipe, maar jy moet bewus wees dat daar ander binêre dataformate is:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Elkeen het hul gebruiksgevalle.As dit 'n bekende (kort) lengte is (bv.gepakte data) dikwels BINARY of VARBINARY Sal werk.Hulle het die bykomende voordeel dat hulle daarop kan indekseer.

Alhoewel dit nie nodig is nie, kan jy probeer base64 enkodeer data in en dekodeer dit uit.Dit beteken dat die db net ascii-karakters sal hê.Dit sal 'n bietjie meer ruimte en tyd neem, maar enige probleem wat met die binêre data te doen het, sal uitgeskakel word.

As die - nie aanbeveel nie - BLOB-veld bestaan, jy kan data op hierdie manier stoor:

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

Idee geneem uit hier.

Die vraag ontstaan ​​ook hoe om die data in die BLOB te kry.U kan die data in 'n INSERT-stelling plaas, soos die PHP-voorbeeld toon (alhoewel u mysql_real_escape_string in plaas van byvoegsels).As die lêer op die databasisbediener bestaan, kan jy ook MySQL's gebruik LAAI_LÊER

Wanneer ek binêre data moet stoor, gebruik ek altyd VARBINARY formaat, soos bekendgestel byd0nut.

U kan dokumentasie op MySQL-webwerf vind onder gedokumenteerde onderwerp 12.4.2 Die BINÊRE en VARBINÊRE Tipes

As jy vra wat is voordele, kyk asseblief na vraag hoekom-varbinêr-in plaas van-varchar

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top