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