Données binaires en MySQL
10 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 se trouve dans un domaine de type / attribut de données BLOB
. BLOB est l'abréviation de binaire grand objet et ce type de données de colonne est spécifique pour le traitement des données binaires.
Voir à la page de manuel de 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 stocker 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 se trouve leur force de performance: rappelez-vous L'ancien article de Joel sur pourquoi les bases de données sont si rapides? parce qu'il faut exactement 1 incrémenter pointeur pour déplacer d'un enregistrement à un autre enregistrement. Si vous ajoutez des données de BLOB de taille indéfinie et très variable, vous gâcherez les performances.
à la place, stocker des fichiers dans le système de fichiers, et stocker des noms de fichiers dans votre base de données.
alors que vous n'avez pas dit ce que vous stockez, et que vous avez peut-être une bonne raison de le faire, souvent la réponse est "en tant que référence du système de fichiers" et les données réelles sont 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 type de données LONGBLOB
, mais vous devez être conscient qu'il existe d'autres formats de données binaires:
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY
ont chacun leurs boîtes d'utilisation. S'il s'agit d'une longueur (courte) connue (p. ex. données emballées), souvent les temps BINARY
ou VARBINARY
fonctionneront. Ils ont l'avantage supplémentaire d'être en mesure ton index sur eux.
bien que cela ne soit pas nécessaire, vous pouvez essayer base64
encodage des données et leur décodage. 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 - n'est pas recommandé - BLOB 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 de ici .
la question se pose également de savoir comment introduire les données dans le BLOB. Vous pouvez placer les données dans une instruction INSERT, comme le montre L'exemple PHP (bien que vous devez utiliser mysql_real_escape_string au lieu d'addslashes). Si le fichier existe sur le serveur de base de données, vous pouvez également utiliser MySQL LOAD_FILE
quand j'ai besoin de stocker des données binaires, j'utilise toujours le format VARBINARY
, comme introduit byd0nut
.
vous pouvez trouver de la documentation sur le site Web de MySQL sous sujet documenté 12.4.2 les types binaire et VARBINAIRE
si vous demandez ce que sont les avantages, s'il vous plaît regarder la question pourquoi-varbinary-au lieu-de-varchar