如何将文件插入MySQL数据库?

40
我希望能够使用Web服务将一个文件插入到远程Web服务器上的MYSQL数据库中。
我的问题是:什么类型的表列(例如varchar等)可以存储文件?在插入文件时,插入语句是否会有所不同?
4个回答

31

MySQL类型文件大小:

  • TINYBLOB 255字节 = 0.000255 Mb
  • BLOB 65535字节 = 0.0655 Mb
  • MEDIUMBLOB 16777215字节 = 16.78 Mb
  • LONGBLOB 4294967295字节 = 4294.97 Mb = 4.295 Gb

然而,在大多数情况下,即使数据库支持它,我也不建议在数据库中存储大的字节块,因为它会增加整个数据库的大小并可能导致实际性能问题。您可以在此阅读更多有关此主题的信息。许多关心一致性性能的数据库甚至不允许您执行此操作。例如,AWS DynamoDB被认为在任何规模上表现极佳,但限制单个项记录为400KB。MongoDB允许16MB,这对我来说已经太多了。如果您愿意,MySQL允许全部4GB。但是,请再三考虑。您可以使用这些列类型存储大数据块的情况是-您具有小流量的数据库,并且您只想将所有内容保存在一个位置以实现更快的开发。例如,小公司的内部系统。


28

MySQL中有几种BLOB类型,请查看https://dev59.com/nm025IYBdhLWcg3whGWx#43514588。 - Lukas Liesis

22

其他答案会给你一个很好的想法,如何实现你所要求的....

然而

并不是很多情况下这是一个好主意。通常最好只在数据库中存储文件名,并在文件系统上存储文件。

这样你的数据库会更小,更容易传输,更重要的是备份和恢复速度更快。


2
我完全同意这一点。文件系统是用于存储和提供文件的构建 -- 它们在这方面非常出色。然而,Blob始终存在,以防它使您的工作更轻松。我可以看到一些托管设置,在其中将文件塞入数据库中将节省时间、精力,甚至可能有助于提高速度。 - Brian Webster
1
@hamlin11,如果只是几个文件的话,你是正确的。但如果是用于某种文档存储区域,那么这样做就是大忌了。 - David Steele
但是如果你想要保持完整性,你必须同时备份图像,这有点抵消了你的唯一优点。使用其中之一并没有真正的优势。 - Leccho

13

你需要使用BLOB类型,它有TINY、MEDIUM、LONG和普通四种类型,根据你所需的大小选择其中的一种。

TINYBLOB 255
BLOB 65535
MEDIUMBLOB 16777215
LONGBLOB 4294967295
(in bytes)

插入语句比较正常。您需要使用fread读取文件,然后对其进行addslashes处理。


谢谢您的回复。那么当我创建插入语句时,我只需在插入的值部分输入“abc.pdf”吗?还是我需要做其他的事情? - meetpd
哦不,你插入了内容,那就是你用fread读取的内容。 - Daniel Bang
谢谢您的快速回复。那么,您能否给我展示一个插入语句的样例,它会是什么样子? - meetpd
2
hamlin11发布的链接(PHP示例)展示了文件读取和插入语句的示例。 - Daniel Bang
3
"addslashes" 是一个函数名。我敢打赌,在所有支持 MySQL 驱动程序的重要编程语言中,都支持准备好的语句(这很可能更安全)……" - Andre Holzner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接