MySQL中的二进制数据

如何在MySQL中存储二进制数据?

phpguy的答案是正确的,但我认为在那里的附加细节有很多混淆。

基本的答案是在BLOB数据types/属性域中。 BLOB是二进制大对象的缩写,而列数据types是专门用于处理二进制数据的。

请参阅MySQL的相关手册页 。

对于这样的表格:

 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) ); 

这是一个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> 

我强烈build议不要在关系数据库存储二进制数据。 关系数据库被devise为使用固定大小的数据; 这就是他们的performance力量所在:请记住Joel关于数据库如此之快的旧文章 。 因为它从一个logging移动到另一个logging需要精确的1个指针。 如果添加未定义的和大小不一的BLOB数据,则会使性能下降。

而是将文件存储在文件系统中,并将文件名存储在数据库中。

虽然你没有说出你正在存储的内容,而你可能有很好的理由这样做,但是通常的答案是“作为文件系统引用”,实际的数据在文件系统中。

http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html

这取决于你想存储的数据。 上面的例子使用LONGBLOB数据types,但是你应该知道还有其他的二进制数据格式:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

每个人都有自己的用例。 如果它是一个已知(短)的长度(例如打包数据)经常BINARYVARBINARY将工作。 他们有能力吨指数附加的好处。

虽然它不应该是必要的,你可以尝试base64编码数据和解码出来。 这意味着数据库将只有ASCII字符。 这将需要更多的空间和时间,但任何与二进制数据有关的问题都将被消除。

如果存在 – 不推荐的 BLOB字段,则可以这样保存数据:

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

从这里采取的想法。

问题也出现在如何将数据存入BLOB中。 您可以将数据放在INSERT语句中,如PHP示例所示(尽pipe您应该使用mysql_real_escape_string而不是addslashes)。 如果文件存在于数据库服务器上,那么也可以使用MySQL的LOAD_FILE

这里有更好的存储实现。 您将遇到Florian的实施问题。

当我需要存储二进制数据时,我总是使用由byd0nut引入的VARBINARY格式。

您可以在MySQL网站的文档12.4.2 BINARY和VARBINARYtypes下find文档

如果你问什么是有利的,请看问题why-varbinary-instead-of-varchar