Pregunta

¿Cómo almaceno datos binarios en mysql?

¿Fue útil?

Solución

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

La respuesta básica está en una BLOB tipo de datos/dominio de atributos. GOTA es la abreviatura de Binary Large Object y ese tipo de datos de columna es específico para manejar datos binarios.

Ver la página de manual relevante para MySQL.

Otros consejos

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

Lo recomiendo contra almacenar datos binarios en una base de datos relacional.Las bases de datos relacionales están diseñadas para funcionar con datos de tamaño fijo;ahí es donde está su fortaleza de desempeño:recordar El antiguo artículo de Joel. ¿Por qué las bases de datos son tan rápidas?porque se necesita 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 archivos en el sistema de archivos y almacene los nombres de los archivos en su base de datos.

Si bien no ha dicho lo que está almacenando, y es posible que tenga una buena razón para hacerlo, a menudo la respuesta es "como referencia del sistema de archivos" y los datos reales están en algún lugar del sistema de archivos.

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

Depende de los datos que desee almacenar.El ejemplo anterior utiliza el LONGBLOB tipo de datos, pero debes 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 conocida (corta) (p. ej.datos empaquetados) muchas veces BINARY o VARBINARY trabajará.Tienen el beneficio adicional de poder indexarlos.

Si bien no debería ser necesario, puedes intentarlo. base64 codificar datos y decodificarlos.Eso significa que la base de datos solo tendrá caracteres ascii.Tomará un poco más de espacio y tiempo, pero se eliminará cualquier problema relacionado con los datos binarios.

Si el - no recomendado - El campo BLOB existe, puedes guardar los datos de esta manera:

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

idea tomada de aquí.

También surge la pregunta de cómo introducir los datos en el BLOB.Puedes poner los datos en una declaración INSERT, como muestra el ejemplo de PHP (aunque deberías usar mysql_real_escape_string en lugar de agregar pestañas).Si el archivo existe en el servidor de la base de datos, también puede utilizar MySQL CARGAR ARCHIVO

Cuando necesito almacenar datos binarios siempre uso VARBINARY formato, tal como se introdujo byd0nut.

Puede encontrar documentación en el sitio web de MySQL en el tema documentado. 12.4.2 Los tipos BINARIO y VARBINARIO

Si pregunta cuáles son las ventajas, consulte la pregunta. por qué-varbinary-en-lugar-de-varchar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top