197 votes

Données binaires dans MySQL

Comment puis-je stocker des données binaires dans MySQL ?

1 votes

2 votes

@Nevir : Quelles informations recherchez-vous spécifiquement ? Qu'est-ce qui manque, selon vous, dans @phpguy's y @Mat's des réponses ?

0 votes

Puisque je ne peux pas poster de réponse, je suppose que je vais le faire ici. Si vous voulez stocker certaines données binaires, vous pouvez créer une table, configurer un fichier PHP ou script pour le stocker, et écrire certaines données binaires dans votre table et laisser le script faire son travail. Sérieusement, je ne sais pas vraiment comment utiliser PHP dans d'autres langues...

143voto

Mat Points 2512

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 BLOB type de données / domaine de l'attribut. BLOB est l'abréviation de Binary Large Object et le type de données de cette colonne est spécifique à la manipulation de données binaires.

Voir la page de manuel pertinente pour MySQL .

59voto

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 en 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>

43voto

Alex Weinstein Points 5839

Je recommande vivement contre le stockage de 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 en termes de performances : n'oubliez pas que L'ancien article de Joel Pourquoi les bases de données sont-elles si rapides ? Parce qu'il faut exactement un incrément de pointeur pour passer d'un enregistrement à un autre. Si vous ajoutez des données BLOB d'une taille indéfinie et très variable, vous bousillez 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.

11 votes

Je n'ai pas rétrogradé, mais c'est peut-être parce qu'il a laissé entendre qu'il ne fallait JAMAIS le faire, plutôt que de dire que c'est une mauvaise idée la plupart du temps. Je suis d'accord avec lui en général, mais pas dans 100% des cas. Il peut y avoir des considérations autres que les performances. Par exemple, je travaille actuellement sur un projet pour lequel les performances n'ont aucune importance. D'autres facteurs tels que la centralisation, la simplicité et les sauvegardes signifient que dans ce cas, le stockage dans la base de données est logique. Une autre raison courante est la réplication.

1 votes

Le champ BLOB a une taille fixe de 64 kilo-octets. Elle n'est pas variable, n'est-ce pas ?

0 votes

Un bloc de 64 Ko ne peut pas contenir beaucoup de fichiers. Vous devrez donc avoir plus d'un bloc de 64 Ko pour stocker les données.

23voto

Issac Kelly Points 3014

Bien que vous n'ayez pas précisé ce que vous stockez, et que vous ayez 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

18voto

d0nut Points 232

Cela dépend des données que vous souhaitez stocker. L'exemple ci-dessus utilise le LONGBLOB mais vous devez savoir qu'il existe d'autres types de données binaires :

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Chacun a son utilité. S'il s'agit d'une longueur connue (courte) (par exemple, des données emballées), BINARY ou VARBINARY fonctionnera la plupart du temps. Ils présentent l'avantage supplémentaire de pouvoir être indexés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X