我想知道Oracle的CLOB通过BLOB数据类型提供了什么。 Both的数据存储限制为(4 GB - 1)* DB_BLOCK_SIZE。
长度超过4000字节的文本字符串不适合VARCHAR2列。现在,我也可以使用CLOB和BLOB来存储这个字符串。
每个人都说,CLOB很好用于字符数据,而BLOB用于二进制数据,如图像,非结构化文档。
但我发现我也可以将字符数据存储在BLOB中。
我想知道的:
所以,问题在于基础知识,为什么CLOB以及BLOB为什么不总是?编码有什么关系吗?
可能是问题标题应该是,CLOB如何处理字符数据的方式与BLOB不同?
我想知道BLOB如何处理字符类型数据。
它不会将其视为字符类型数据,它只将其视为字节流 - 它不知道或不关心它代表什么。
BLOB数据类型存储非结构化二进制大对象。 BLOB对象可以被认为是没有字符集语义的比特流。
clob是否存储conding信息并在检索数据时使用它?
不明确,但数据存储在数据库字符集中,与VARCHAR2
数据一样。 From the documentation again:
CLOB数据类型存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集,并且都使用数据库字符集。
您可能还注意到dbms_lob
包具有在CLOB和BLOB数据类型之间进行转换的过程。对于这两者,您必须指定要使用的字符集。因此,如果您选择将字符数据存储为BLOB,则在将其转换为BLOB时必须知道字符集,但更重要的是,您必须知道字符集才能将其转换回来。你可以做到,但这并不意味着你应该这样做。在尝试将其转换为字符串之前,您无法验证BLOB数据。
正如@APC所提到的,这类似于将日期存储为字符串 - 您使用正确的数据类型会给您带来优势和类型安全性,而无需额外增加额外的痛苦,不确定性和开销。
问题不在于CLOB对BLOB存储字符数据的优势;问题恰恰相反:BLOB对CLOB存储的字符数据有什么优势?答案通常是没有。
@Boneist提及the recommendation to store JSON as BLOBs,还有更多关于here。
(我可以想到的唯一其他原因是你必须存储来自多个源字符集的数据,并希望保留它们,就像你收到它们一样。但是你要么只是存储它们而且永远不会检查或操纵它们。来自数据库本身的数据,并且只会将它们返回到一些未受影响的外部应用程序;在这种情况下,您不关心字符集 - 因此您处理的是纯二进制数据,不应将其视为字符数据毕竟,你关心的是你所存储的图像是PNG与JPG还是其他什么。或者你需要处理数据,因此必须记录每个BLOB对象所代表的字符集,所以你可以根据需要进行转换。)