¿Cómo almaceno datos binarios en MySQL ?
¿Cómo almaceno datos binarios en MySQL ?
Respuestas:
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 BLOBdominio de tipo de datos / atributo. BLOB es la abreviatura de Binary Large Object y ese tipo de datos de columna es específico para manejar datos binarios.
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>
Recomiendo no almacenar 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á su fortaleza de rendimiento: recuerde el antiguo artículo de Joel sobre por qué las bases de datos son tan rápidas. porque se necesita exactamente un incremento de 1 puntero para moverse de un registro a otro registro. 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 puede tener 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 desea almacenar. El ejemplo anterior utiliza el LONGBLOBtipo de datos, 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) (p. Ej., Datos empaquetados), muchas veces BINARYo VARBINARYfuncionará. Tienen el beneficio adicional de poder indexarlos.
Si bien no debería ser necesario, podría intentar base64codificar datos y decodificarlos. 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 - no recomendado - BLOB, puede 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 llevar los datos al BLOB. Puede poner los datos en una instrucción INSERT, como muestra el ejemplo de PHP (aunque debería usar mysql_real_escape_string en lugar de addlashes). 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 VARBINARYformato, como se presentó 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 cuáles son las ventajas, consulte la pregunta por qué-varbinary-en lugar de-varchar