Question

Comment stocker des données binaires dans MySQL?

Était-ce utile?

La solution

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 fondamentale est dans un BLOB type de données/domaine d'attribut. GOUTTE 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.

Voir la page de manuel pertinente pour MySQL.

Autres conseils

Pour un tableau comme celui-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 réside leur force de performance :souviens-toi L'ancien article de Joël pourquoi 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 nuirez aux 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 ayez peut-être une bonne raison de le faire, la réponse est souvent « comme référence du 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 formats de données binaires :

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Chacun a ses cas d’utilisation.S'il s'agit d'une longueur (courte) connue (par ex.données compressées) souvent BINARY ou VARBINARY marchera.Ils ont l’avantage supplémentaire de pouvoir les indexer.

Même si cela ne devrait pas être nécessaire, vous pouvez essayer base64 encoder les données et 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 la - non recommandé - Le champ BLOB existe, vous pouvez sauvegarder 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 faire entrer 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 deviez utiliser mysql_real_escape_string au lieu de barres obliques supplémentaires).Si le fichier existe sur le serveur de base de données, vous pouvez également utiliser le fichier MySQL FICHIER DE CHARGEMENT

Lorsque j'ai besoin de stocker des données binaires, j'utilise toujours VARBINARY format, tel qu'introduit byd0nut.

Vous pouvez trouver de la documentation sur le site Web MySQL sous le sujet documenté 12.4.2 Les types BINARY et VARBINARY

Si vous demandez quels sont les avantages, veuillez consulter la question pourquoi-varbinary-au lieu-de-varchar

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top