Datos binarios en MySQL

votos
163

¿Cómo almaceno datos binarios en MySQL ?

Publicado el 01/08/2008 a las 06:09
fuente por usuario
En otros idiomas...                            


10 respuestas

votos
128

La respuesta de phpguy es correcta, pero creo que hay mucha confusión en los detalles adicionales allí.

La respuesta básica está en un BLOBtipo de datos / dominio de atributo. BLOB es la abreviatura de Objeto grande binario y ese tipo de datos de columna es específico para manejar datos binarios.

Vea la página del manual relevante para MySQL .

Respondida el 01/08/2008 a las 13:16
fuente por usuario

votos
54

Para una mesa como esta:

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)
);

Aquí hay un ejemplo de 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 IGNORE  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>
Respondida el 01/08/2008 a las 06:12
fuente por usuario

votos
37

Recomiendo encarecidamente que no se almacenen datos binarios en una base de datos relacional. Las bases de datos relacionales están diseñadas para trabajar con datos de tamaño fijo; ahí es donde está la fortaleza de su desempeño: ¿recuerdas el viejo artículo de Joel sobre por qué las bases de datos son tan rápidas? porque toma exactamente 1 incremento de puntero para pasar de un registro a otro. Si agrega datos BLOB de tamaño indefinido y muy variable, arruinará el rendimiento.

En su lugar, almacene los archivos en el sistema de archivos y almacene los nombres de los archivos en su base de datos.

Respondida el 17/09/2008 a las 21:37
fuente por usuario

votos
20

Si bien no ha dicho lo que está almacenando, y puede tener una buena razón para hacerlo, a menudo la respuesta es 'como una referencia del sistema de archivos' y los datos reales están en el sistema de archivos en alguna parte.

http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html

Respondida el 02/08/2008 a las 15:57
fuente por usuario

votos
16

Depende de los datos que desea almacenar. El ejemplo anterior utiliza el LONGBLOBtipo de datos, pero se debe tener en cuenta que existen otros formatos de datos binarios:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Cada uno tiene sus casos de uso. Si se trata de una longitud (corto) conocida (por ejemplo, datos empaquetados) muchas veces BINARYo VARBINARYva a funcionar. Tienen la ventaja añadida de ser capaz índice de toneladas en ellos.

Respondida el 31/12/2010 a las 02:04
fuente por usuario

votos
13

Si bien no debería ser necesario, podrías intentar base64codificar y decodificar los datos. Eso significa que el DB solo tendrá caracteres ascii. Tomará un poco más de espacio y tiempo, pero se eliminará cualquier problema relacionado con los datos binarios.

Respondida el 16/09/2008 a las 05:07
fuente por usuario

votos
10

Si el - no se recomienda - existe campo BLOB, puede guardar datos de esta manera:

mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");

Idea tomada de aquí .

Respondida el 12/09/2013 a las 13:00
fuente por usuario

votos
9

Cuando necesito para almacenar datos binarios siempre uso VARBINARYel formato, introducido byd0nut.

Puede encontrar documentación en el sitio web de MySQL bajo el tema documentado 12.4.2 El binario y tipos VARBINARY

Si se está preguntando ¿cuáles son advantagese, por favor vaya a la pregunta por qué, varbinary-lugar-de-varchar

Respondida el 01/05/2014 a las 10:37
fuente por usuario

votos
9

La pregunta también surge cómo obtener los datos en el BLOB. Puede colocar los datos en una instrucción INSERT IGNORE, como muestra el ejemplo de PHP (aunque debe usar mysql_real_escape_string en lugar de addslashes). Si el archivo existe en el servidor de la base de datos, también puede usar LOAD_FILE de MySQL

Respondida el 27/08/2008 a las 16:13
fuente por usuario

votos
8

Una implementación de almacenamiento mucho mejor disponible aquí . Te encontrarás con problemas con la implementación de Florian.

Respondida el 17/09/2008 a las 10:53
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more