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 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.
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 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.
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 VARBINARYformato, 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