¿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 BLOB
dominio 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 LONGBLOB
tipo 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 BINARY
o VARBINARY
funcionará. Tienen el beneficio adicional de poder indexarlos.
Si bien no debería ser necesario, podría intentar base64
codificar 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 VARBINARY
formato, 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