Answers:
phpguy的答案是正确的,但我认为那里的其他细节存在很多混乱。
基本答案是在BLOB
数据类型/属性域中。BLOB是Binary Large Object的缩写,该列数据类型特定于处理二进制数据。
请参见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>
我强烈建议不要在关系数据库中存储二进制数据。关系数据库旨在处理固定大小的数据。那就是他们的性能优势所在:还记得乔尔(Joel)关于数据库为何如此之快的旧文章吗?因为从一条记录移动到另一条记录仅需要1个指针增量。如果添加大小不确定且大小各不相同的BLOB数据,则会提高性能。
而是将文件存储在文件系统中,并将文件名存储在数据库中。
尽管您没有说出要存储的内容,但是这样做的理由可能很充分,但答案通常是“作为文件系统参考”,而实际数据位于文件系统中的某个位置。
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
还有一个问题是如何将数据放入BLOB。您可以将数据放在INSERT语句中,如PHP示例所示(尽管您应该使用mysql_real_escape_string而不是addlashes)。如果文件存在于数据库服务器上,则还可以使用MySQL的LOAD_FILE
当我需要存储二进制数据时,我总是使用VARBINARY
format,如前所述byd0nut
。
您可以在MySQL网站上的已记录主题12.4.2 BINARY和VARBINARY类型下找到文档。
如果您要问什么是优点,请查看以下问题:为什么-varbinary-instead-of-varchar