Données binaires en MySQL

Comment stocker des données binaires dans MySQL ?

169
demandé sur Falcon 2008-08-01 09:09:55

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 .

131
répondu Mat 2016-06-02 05:55:17

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>
56
répondu mauris 2016-06-02 05:56:26

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.

37
répondu Alex Weinstein 2011-09-02 06:19:41

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

21
répondu Issac Kelly 2008-08-02 14:57:13

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.

16
répondu d0nut 2012-12-15 09:48:25

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é.

13
répondu user10117 2014-07-11 14:51:55

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 .

10
répondu Community 2017-05-23 12:09:57

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

9
répondu Scott Noyes 2008-08-27 15:13:31

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

9
répondu zeppaman 2017-05-23 11:46:53

une bien meilleure implémentation de stockage dans Disponible ici . Tu vas avoir des problèmes avec L'implémentation de Florian.

8
répondu DreamWerx 2011-09-02 06:19:20