¿Cómo almaceno datos binarios en MySQL?Datos binarios en MySQL
Respuesta
La respuesta por 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 de datos/atributos BLOB
. BLOB es la abreviatura de Objeto grande binario y ese tipo de datos de columna es específico para el manejo de datos binarios.
Para una tabla como la siguiente:
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í está un ejemplo de PHP:
<?php
// store.php3 - by Florian Dittmer <[email protected]>
// 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>
Este código se parece a PHP3 (o quizás 4), que register_globals habilitado. No desea ejecutar este código, y tampoco funcionará en una instalación PHP semi actualizada (que es la versión 5). – Till
-1 para addslashes() donde mysql_real_escape_string() es necesario. ¿Podemos por favor dejar de darle código a las personas con vulnerabilidades de inyección SQL? (No, addslashes() NO es suficiente.) – chaos
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 el sistema de archivos en alguna parte.
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
También surge la pregunta de cómo obtener los datos en el BLOB. Puede colocar 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 utilizar MySQL's LOAD_FILE
Si bien no debería ser necesario, puede probar base64
codificando datos y descodificándolos. 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.
Implementación de almacenamiento mucho mejor en here disponible. Te encontrarás con problemas con la implementación de Florian.
Recomiendo encarecidamente contra almacenando 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 rendimiento: recuerde Joel's old article ¿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.
No he votado negativamente, pero podría deberse a que él insinúa que NUNCA debes hacerlo, en lugar de decir que es una mala idea la mayor parte del tiempo. Estoy de acuerdo con él en general, pero no en el 100% de los casos. Puede haber otras consideraciones aparte del rendimiento. Por ejemplo, estoy trabajando en algo ahora donde el rendimiento no importa para nada. Otros factores como la centralización, la simplicidad y las copias de seguridad significan que en este caso el almacenamiento en la base de datos tiene sentido. Otra razón común es la replicación. – YeB
El campo BLOB tiene un tamaño fijo de 64 kilobytes. No está variando, ¿verdad? –
64 KB no cabe en muchos archivos, por lo que deberá tener más de un bloque de 64 KB para almacenar los datos. –
Depende de los datos que desea almacenar. El ejemplo anterior utiliza el tipo de datos LONGBLOB
, 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 conocida (corta) (por ejemplo, datos empaquetados), muchas veces BINARY
o VARBINARY
funcionarán. Tienen el beneficio adicional de poder tener un índice sobre ellos.
Si el - not recommended - 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 here.
Cuando necesito almacenar datos binarios, siempre utilizo el formato VARBINARY
, como se introdujo byd0nut
.
Puede encontrar documentación en el sitio web de MySQL bajo el tema documentado 12.4.2 The BINARY and VARBINARY Types
Si se está preguntando ¿cuáles son advantagese, por favor mire pregunta why-varbinary-instead-of-varchar
- 1. Insertar datos binarios en MySQL (sin PreparedStatement)
- 2. almacenamiento de datos binarios en mysql
- 3. PHP- insertando datos binarios en mysql usando declaraciones preparadas
- 4. Almacenando valores hexadecimales como binarios en MySQL
- 5. Analizando datos binarios en C?
- 6. iPhone escribiendo datos binarios
- 7. DbUnit y datos binarios
- 8. BlobBuilder arruina datos binarios
- 9. Git y datos binarios
- 10. StreamReader y datos binarios
- 11. Envío de datos binarios
- 12. Obteniendo datos binarios usando SqlDataReader
- 13. Perl y MongoDB datos binarios
- 14. cURL Datos binarios y datos de formulario
- 15. socket.io streaming de datos binarios
- 16. ¿Es seguro borrar registros binarios MySQL girados?
- 17. ¿Cómo interpretar datos binarios en C++?
- 18. Buscar cadena de caracteres en datos binarios
- 19. Publicar datos binarios en una aplicación RESTful
- 20. Pasar datos binarios como argumentos en bash
- 21. conversión rápida de datos binarios en Python
- 22. ¿Cómo procesar datos binarios grandes en Clojure?
- 23. ¿cómo puedo leer datos binarios en C++?
- 24. Datos binarios sobre el terminal en serie
- 25. httprequest y datos binarios en javascript
- 26. Insertar datos binarios en SQL Server usando PHP
- 27. almacenando datos binarios en cassandra al igual que MYSQL BLOB binario
- 28. Mover registros binarios en MySQL a un disco duro diferente
- 29. Python: Búsqueda/lectura de datos binarios
- 30. Análisis de datos binarios con scala
[almacenar-imágenes-en-db-sí-o-nay] (https://stackoverflow.com/questions/3748/) –
@ Nevir: ¿Qué información busca específicamente? ¿Qué cree que le falta a [@ phpguy's] (https://stackoverflow.com/questions/17/binary-data-in-mysql#18) y [@ Mat's] (https://stackoverflow.com/questions/ 17/binary-data-in-mysql # 26) respuestas? – eggyal
Lo siento, no quise recompensar esto (me encontré con un error de UI con SO), pero no puedo eliminar el bounty – Nevir