Blob 大小是固定的吗?

fiz*_*ban 5 mysql storage memory-optimized-tables

我正在使用 sqlalchemy 将对象存储在数据库中。我正在创建的对象类型在运行时之前是未知的。我可以存储像字符串一样简单的东西。我可以存储一个jpg。我可能会创建自己的文件格式并存储它。重点是它很灵活。

我设想的表格至少包含两列。一个描述文件类型(.jpg、.txt、.py 等),另一个是包含文件数据的 blob。我想知道的是我在创建表时是否需要定义 blob 大小。是否可以让mysql动态设置blob的大小?这将很好地简化我的设计。

我知道还有其他方法可以做到这一点,但我有充分的理由这样做。如果它变成死胡同,我不介意沿着这条路走下去,然后再翻倍。

jyn*_*nus 6

不,正如定义的那样,Blob 是“可以容纳可变数据量的二进制大对象”。它可以容纳 0 到2^16 - 1 个字节(65535)。ALONGBLOB最多可容纳 4,294,967,295 个字节(或 4GB)。

在大多数引擎中,blob 是动态实现的,这意味着它只会取其实际大小加上一些用于长度/寻址等的额外字节。 事实上,固定行大小的格式通常与 blob 不兼容(MyISAM 固定,内存存储引擎)。

然而,有一些原因需要避免在关系数据库上存储“文件”(尤其是 MySQL 和 InnoDB,主要是由于事务和二进制日志的开销,加上多版本及其与内存中的临时表的不兼容)。实际的决定取决于需要 - 最常见的替代方法是将它们存储在文件系统上,然后在数据库中添加一个 URL。

如果您将这些对象存储在数据库中,那么大小将不是您最大的问题(除非它们超过 4GB),而是复杂查询和写入的性能。但是,纯键值存储可能适用于 MySQL 模型。还有专门的基于文档的数据库。