存储长二进制(原始数据)字符串

时间:2011-09-15 16:49:41

标签: mysql postgresql database-design blob

我们正在捕获一个大小可变的原始二进制字符串(从100k到800k),我们希望存储这些单独的字符串。它们不需要被编入索引(duh),并且不会对该字段的内容进行任何查询。

这些插页的数量将非常大(它们用于存档目的),比方说每天10,000。这些大型二进制字符串的最佳字段类型是什么?应该是text还是blob还是其他什么?

3 个答案:

答案 0 :(得分:15)

PostgreSQL 而言,输入text是不可能的。为了这个目的,它比bytea更慢,使用更多空间并且更容易出错 基本上有3种方法:

  1. 使用类型bytea(基本上是pb等效的SQL blob类型)

  2. 使用"large objects"

  3. 将blob存储为 filesystem 中的文件,并仅存储文件名 在数据库中。

  4. 每个人都有自己的优点和缺点。

    1. 处理起来相当简单,但需要的磁盘空间最多。需要一些解码和编码,这使得它也很慢。备份的规模迅速增长!

    2. 在处理方面略显尴尬,但您有自己的基础设施来操纵blob - 如果您需要它。您可以更轻松地进行单独备份。

    3. 是目前最快的方式,使用的磁盘空间最少。但它不提供存储在数据库中时的参照完整性。

    4. 我有许多像图像文件那样的实现:在bytea字段中存储小缩略图,以便参照完整性和快速参考。将原始图像作为文件存储在文件系统中。当然,您需要考虑何时以及如何删除过时的文件,如何备份外部文件等。

答案 1 :(得分:2)

您应该在大多数数据库中使用blobtext列通常会根据文本编码或区域设置进行规范化或转换;因此可能无法按预期保留实际字节。几乎在所有情况下,这是textblob列之间的唯一区别。

答案 2 :(得分:0)

我们有用户VARBINARY列来存储最多300 MB的文件。