Datos Binarios en MySQL
¿Cómo puedo almacenar datos binarios en MySQL?
10 answers
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 de datos / atributo BLOB
. BLOB es la abreviatura de Objeto Binario Grande y ese tipo de datos de columna es específico para el manejo de datos binarios.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-02 05:55:17
Para una tabla 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 <[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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-02 05:56:26
Recomiendo encarecidamente contra 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 1 incremento de puntero para pasar de un registro a otro registro. Si agrega datos de BLOB de tamaño indefinido y muy variable, arruinará el rendimiento.
En su lugar, almacenar archivos en el sistema de archivos, y almacene nombres de archivo en su base de datos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 06:19:41
Si bien no ha dicho lo que está almacenando, y puede tener una gran 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 algún lugar.
Http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-02 14:57:13
Depende de los datos que desee almacenar. El ejemplo anterior utiliza el tipo de datos LONGBLOB
, pero debe tener en cuenta que hay 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) muchas veces BINARY
o VARBINARY
funcionará. Tienen el beneficio adicional de poder ton index en ellos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-15 09:48:25
Si bien no debería ser necesario, podría intentar 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 cualquier problema que tenga que ver con los datos binarios será eliminado.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-11 14:51:55
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í.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:57
También surge la pregunta de cómo obtener los datos en el 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 addslashes). Si el archivo existe en el servidor de base de datos, también puede usar MySQL LOAD_FILE
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 15:13:31
Cuando necesito almacenar datos binarios siempre uso el formato VARBINARY
, como se introdujo byd0nut
.
Puede encontrar documentación en el sitio web de MySQL en documented topic 12.4.2 Los tipos BINARIO y VARBINARIO
Si estás preguntando cuáles son las ventajas, por favor mira la pregunta por qué-varbinary-en lugar-de-varchar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:53
Una implementación de almacenamiento mucho mejor en disponible aquí. Te encontrarás con problemas con la implementación de Florian.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 06:19:20