Datos binarios en MySQL

¿Cómo almaceno datos binarios en MySQL ?

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 dominio de tipo / atributo de datos BLOB . 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 .

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  // Example php script to demonstrate the storing of binary files into // an sql database. More information can be found at http://www.phpbuilder.com/ ?>  Store binary data into SQL Database  < ?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 "

This file has the following Database ID: $id"; mysql_close(); } else { // else show the form to submit new data: ?>

File Description:

File to upload/store in database:

< ?php } ?>

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.

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

Depende de los datos que desea almacenar. El ejemplo anterior utiliza el tipo de datos LONGBLOB , pero 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 es una longitud conocida (corta) (por ejemplo, datos empaquetados) a menudo BINARY o VARBINARY funcionará. Tienen el beneficio adicional de poder tener un índice sobre ellos.

Si bien no debería ser necesario, puedes probar la encoding de datos base64 y decodificarla. 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.

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

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

Idea tomada de aquí .

La pregunta también surge cómo obtener los datos en el BLOB. Puede poner los datos en una instrucción INSERT, 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

Cuando necesito almacenar datos binarios siempre uso el formato VARBINARY , como lo introdujo byd0nut .

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

Si está preguntando qué ventajas tiene, mire la pregunta por qué-varbinary-instead-of-varchar

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