Come posso archiviare i dati binari in MySQL ?
Come posso archiviare i dati binari in MySQL ?
Risposte:
La risposta di phpguy è corretta ma penso che ci sia molta confusione nei dettagli aggiuntivi lì.
La risposta di base è in un BLOB
tipo 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.
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>
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.
Anche se non hai detto cosa stai memorizzando e potresti avere una grande ragione per farlo, spesso la risposta è 'come riferimento al filesystem' e i dati effettivi si trovano sul filesystem da qualche parte.
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
Dipende dai dati che si desidera archiviare. L'esempio precedente utilizza il LONGBLOB
tipo 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 BINARY
o VARBINARY
funzionerà. Hanno l'ulteriore vantaggio di essere in grado di indicizzarli.
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 .
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
Quando devo archiviare dati binari, utilizzo sempre il VARBINARY
formato, come introdotto byd0nut
.
È possibile trovare la documentazione sul sito Web MySQL nell'argomento documentato 12.4.2 I tipi BINARY e VARBINARY
Se stai chiedendo cosa sono avvantaggiati, guarda la domanda perché-varbinary-invece-di-varchar