在 Oracle 中,LongRaw 和 Varchar2 在 Oracle 中的最大长度为 4kb,但我需要存储 8kb 和 16kb 的对象,所以我想知道什么是好的解决方案。我知道我可以使用 Blob,但 Blob 具有可变长度,如果我是正确的,它基本上是幕后的一个额外文件,一个我不想为我的对象支付的功能和价格。还有其他更适合这种需求的解决方案或数据类型吗?
谢谢
Blob 不是幕后的文件。它存储在数据库中。为什么它具有可变长度很重要?您可以只使用 blob 列(如果您的数据是文本数据,则可以使用 clob)并将其存储在自己的段中。
为什么不分割二进制数据并将其存储在 4K 块中?您可以为这些块有四个不同的列(以及一个用于将它们重建到大结构中的长度列),或者另一个表的更规范化的方式,其中的块与原始表记录相关联。
如果您将来需要它,这将提供扩展。
例如:
Primary table:
-- normal columns --
chunk_id integer
chunk_last_len integer
Chunk table:
chunk_id integer
chunk_sequence integer
chunk varchar2(whatever)
primary key (chunk_id,chunk_sequence)
当然,您可能会发现您的 DBMS 确实在 BLOB 的幕后做了这种行为,让 Oracle 处理它可能更有效,从而使您无需手动从单个块重建数据。我会衡量每个人的表现以找出最佳方法。
不要将二进制数据存储在 varchar2 列中,除非您愿意对它们进行编码(base64 或类似的)。否则字符集问题可能会损坏您的数据!
试试下面的语句看看效果:
select * from (select rownum-1 original, ascii(chr(rownum-1)) data from user_tab_columns where rownum<=256) where original<>data;
您应该使用 BLOB。
BLOB 不存储为额外文件,它作为块存储在您的一个数据文件中(就像其他数据一样)。如果 BLOB 对于单个块来说太大(在您的情况下可能不会发生),那么它将在另一个块中继续。
如果您的 BLOB 数据非常小,您可以让 Oracle 将其与您的行中的其他数据内联存储(如 varchar2)。
在内部,Oracle 正在做类似于 PAX 建议的事情。这些块与减去一些开销的 DB 块一样大。如果您尝试在 Oracle 之上重新发明 Oracle 功能,它只会比本机功能慢。
您还必须重新实现已经在 DBMS_LOB 中提供的一大堆功能(长度、比较等)。
Varchar2 也是可变长度的。如果您需要在数据库中存储任何大于小尺寸的二进制数据,则必须查看 blob 的方向。另一个解决方案当然是将二进制文件存储在文件系统的某个位置,并将文件的路径作为 varchar 存储在 db 中。