Comment stocker des données binaires dans MySQL ?
Comment stocker des données binaires dans MySQL ?
Réponses:
La réponse de phpguy est correcte mais je pense qu'il y a beaucoup de confusion dans les détails supplémentaires.
La réponse de base est dans un BLOB
domaine de type / attribut de données. BLOB est l'abréviation de Binary Large Object et ce type de données de colonne est spécifique à la gestion des données binaires.
Consultez la page de manuel appropriée pour MySQL .
Pour une table comme celle-ci:
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)
);
Voici un exemple 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>
Je recommande fortement contre le stockage des données binaires dans une base de données relationnelle. Les bases de données relationnelles sont conçues pour fonctionner avec des données de taille fixe; c'est là que réside leur force de performance: rappelez-vous l'ancien article de Joel sur les raisons pour lesquelles les bases de données sont si rapides? car il faut exactement 1 incrément de pointeur pour passer d'un enregistrement à un autre. Si vous ajoutez des données BLOB de taille indéfinie et très variable, vous allez bousiller les performances.
Au lieu de cela, stockez les fichiers dans le système de fichiers et stockez les noms de fichiers dans votre base de données.
Bien que vous n'ayez pas dit ce que vous stockez, et que vous avez peut-être une bonne raison de le faire, la réponse est souvent «en tant que référence au système de fichiers» et les données réelles se trouvent quelque part sur le système de fichiers.
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
Cela dépend des données que vous souhaitez stocker. L'exemple ci-dessus utilise le LONGBLOB
type de données, mais vous devez savoir qu'il existe d'autres types de données binaires:
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY
Chacun a ses cas d'utilisation. S'il s'agit d'une longueur connue (courte) (par exemple des données compactées), BINARY
ou VARBINARY
fonctionnera la plupart du temps. Ils ont l'avantage supplémentaire de pouvoir les indexer.
Bien que cela ne soit pas nécessaire, vous pouvez essayer d' base64
encoder les données et de les décoder. Cela signifie que la base de données n'aura que des caractères ascii. Cela prendra un peu plus d'espace et de temps, mais tout problème lié aux données binaires sera éliminé.
Si le champ BLOB - non recommandé - existe, vous pouvez enregistrer les données de cette façon:
mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");
Idée tirée d' ici .
La question se pose également de savoir comment obtenir les données dans le BLOB. Vous pouvez mettre les données dans une instruction INSERT, comme le montre l'exemple PHP (bien que vous deviez utiliser mysql_real_escape_string au lieu des addlashes). Si le fichier existe sur le serveur de base de données, vous pouvez également utiliser LOAD_FILE de MySQL
Lorsque j'ai besoin de stocker des données binaires, j'utilise toujours le VARBINARY
format introduit par d0nut dans l'une des réponses précédentes.
Vous pouvez trouver de la documentation sur le site Web de MySQL sous la rubrique documentée: 12.4.2 Les types BINARY et VARBINARY .
Si vous demandez quels sont les avantages, veuillez lire la question: pourquoi-varbinary-au lieu-de-varchar .