Dati binari in MySQL [chiuso]


186

Come posso archiviare i dati binari in MySQL ?



2
@Nevir: quali informazioni stai cercando specificamente? Cosa ritieni manchi dalle risposte di @ phpguy e @ Mat ?
Eggyal

Spiacente, non intendevo bounty questo (ho
riscontrato

dovresti essere in grado di rimuovere una taglia
Akshay Giri FR

Risposte:


138

La risposta di phpguy è corretta ma penso che ci sia molta confusione nei dettagli aggiuntivi lì.

La risposta di base è in un BLOBtipo di dati / dominio di attributo. BLOB è l'abbreviazione di Binary Large Object e quel tipo di dati di colonna è specifico per la gestione dei dati binari.

Vedere la relativa pagina di manuale per MySQL .


57

Per un tavolo come questo:

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

Ecco un esempio di 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>

9
Questo codice assomiglia a PHP3 (o forse 4), che register_globals ha abilitato. Non si desidera eseguire questo codice e inoltre non funzionerà su un'installazione PHP semi aggiornata (che è la versione 5).
Fino al

26
-1 per addlash () dove è necessario mysql_real_escape_string (). Per favore, possiamo smettere di fornire codice persone con vulnerabilità di SQL injection? (No, addlash () NON è abbastanza buono.)
caos

40

Consiglio vivamente contro la memorizzazione di dati binari in un database relazionale. I database relazionali sono progettati per funzionare con dati di dimensioni fisse; ecco dove sta la loro forza prestazionale: ricordi il vecchio articolo di Joel sul perché i database sono così veloci? perché ci vuole esattamente 1 incremento del puntatore per passare da un record a un altro record. Se aggiungi dati BLOB di dimensioni indefinite e molto variabili, aumenterai le prestazioni.

Conservare invece i file nel file system e archiviare i nomi dei file nel database.


11
Non ho votato a fondo, ma potrebbe essere dovuto al fatto che implica che non dovresti MAI farlo, invece di dire che è una cattiva idea per la maggior parte del tempo. Sono d'accordo con lui in generale, ma non nel 100% dei casi. Possono esserci altre considerazioni oltre alle prestazioni. Ad esempio, sto lavorando a qualcosa in cui le prestazioni non contano affatto. Altri fattori come la centralizzazione, la semplicità e i backup significano che in questo caso la memorizzazione nel database ha senso. Un altro motivo comune è la replica.
LaVache,

4
D'altra parte, la memorizzazione dei dati in db è indipendente dal sistema operativo, il che può essere utile per nomi di file strani. db può memorizzare più file con lo stesso nome file, il sistema operativo no. Non ha problemi di lettura / scrittura / eliminazione. Non ha bisogno di un sistema di backup aggiuntivo. E non è pubblico. Quindi a volte è veloce nello sviluppo. Btw. nessuno ti obbliga a memorizzare tutto nello stesso database, alla fine tutto finisce su un disco.
Joeri,

7
@AlexWeinstein, Stai confondendo i dati binari con i dati a larghezza fissa. Anche i dati binari possono essere a larghezza fissa. E i dati a larghezza fissa non vanno bene per tutte le situazioni. In effetti, in molte situazioni trarrai
Pacerier,

4
Concordo con @Pacerier su questo, BINARY (16) è memorizzato fisso. Per quanto riguarda BLOB: un BLOB ha un puntatore a larghezza fissa per i dati memorizzati all'esterno della tabella. Questo è diverso da varchar o varbinary che lo memorizzano in linea. La ricerca di un BLOB richiede alcuni passaggi aggiuntivi, ma lascialo fuori dalla tua clausola WHERE e va bene.
Garr Godfrey,

4
penso anche che la memorizzazione dei file nel filesystem sia molto rotta e non portatile. cosa succede se il file viene eliminato?
Garr Godfrey,


17

Dipende dai dati che si desidera archiviare. L'esempio precedente utilizza il LONGBLOBtipo di dati, ma è necessario tenere presente che esistono altri formati di dati binari:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Ognuno ha i propri casi d'uso. Se si tratta di una lunghezza nota (breve) (ad es. Dati compressi) spesso volte BINARYo VARBINARYfunzionerà. Hanno l'ulteriore vantaggio di essere in grado di indicizzarli.


14

Anche se non dovrebbe essere necessario, puoi provare a base64codificare e decodificare i dati. Ciò significa che il db avrà solo caratteri ASCII. Ci vorrà un po 'più di spazio e tempo, ma qualsiasi problema relativo ai dati binari verrà eliminato.


11

Se esiste il campo - non raccomandato - BLOB, è possibile salvare i dati in questo modo:

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

Idea presa da qui .


10

Si pone inoltre la domanda su come ottenere i dati nel BLOB. Puoi inserire i dati in un'istruzione INSERT, come mostra l'esempio di PHP (anche se dovresti usare mysql_real_escape_string invece di addlash). Se il file esiste sul server di database, puoi anche utilizzare LOAD_FILE di MySQL


Quel link dice che MySQL_real_escape_string è deprecato.
Poul Bak,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.