Oracle CLOB和BLOB的区别

5
我想知道Oracle的CLOB相比BLOB数据类型有什么优势。两者都有(4 GB-1)*DB_BLOCK_SIZE的数据存储限制。
一个文本字符串如果超过4000个字节就无法放入VARCHAR2列中。现在,我可以使用CLOB和BLOB来存储这个字符串。
每个人都说,“CLOB适用于字符数据”,而“BLOB适用于二进制数据,如图像、非结构化文档”。
但是我发现我也可以在BLOB中存储字符数据。
我想知道的是:基础问题是为什么总是使用CLOB而不是BLOB?这与编码有关吗?
也许问题标题应该是“CLOB如何与BLOB不同地处理字符数据?”

3
在一个包含 BLOB 字段的表上运行 select * from ...,然后快速告诉我 BLOB 内部的文本是什么。如果你无法读取它,那么告诉我存储这些字节时使用的编码方式,因为如果你想将原始字节转换回可读字符串,就必须知道编码方式。 - user330315
2
为什么你不会使用 CLOB 来存储字符数据?这就像在 DATE 列中存储日期和在 NUMBER 列中存储数值:使用最适合要存储的数据类型。 - APC
1
所有与字符串相关的函数,如REGEXP_xxxSUBSTRxPADxTRIM等,仅适用于CLOB而不适用于BLOB。为什么你会考虑将字符数据存储在BLOB中呢? - Wernfried Domscheit
3
@ShaileshPratapwar - 不,那个答案(无论如何都是不完整的,不知道它为什么会有这么多赞)最多只能从 BLOB 中给你选择一些字节,而不是字符。那些字节可能代表字符,如果你知道它们所表示的字符集,你就可以将它们转换;但如果它们来自多字节字符集,你可能会将一个字符分割成两半,甚至无法进行转换。(或者错误地转换,而没有注意到这一点。) - Alex Poole
2
值得一提的是,Oracle建议将JSON(即文本)存储在BLOB数据类型中:[搜索“使用LOB存储JSON数据时的注意事项”](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/overview-of-storage-and-management-of-JSON-data.html#GUID-26AB85D2-3277-451B-BFAA-9DD45355FCC7),并列出了一些原因,主要涉及字符集转换和大小。 - Boneist
显示剩余6条评论
1个回答

2
我想知道BLOB如何处理字符类型的数据。
它不会将其视为字符类型的数据,只会将其视为一系列字节流 - 它不知道也不关心它代表什么。
根据文档
BLOB数据类型存储非结构化二进制大对象。 BLOB对象可以被看作没有字符集语义的位流。
CLOB是否在存储数据时同时存储编码信息,并在检索数据时使用它?
不是显式地存储,但是数据以与VARCHAR2数据相同的数据库字符集存储。根据文档所述,“CLOB数据类型存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集,两者都使用数据库字符集。”
您可能还注意到,dbms_lob包有将CLOB和BLOB数据类型相互转换的过程。对于这两种类型,您必须指定要使用的字符集。因此,如果选择将字符数据存储为BLOB,则在将其转换为BLOB时必须知道字符集,但更重要的是,您必须知道字符集才能将其转换回来。您可以这样做,但并不意味着您应该这样做。在尝试将其转换为字符串之前,您无法验证BLOB数据。
正如@APC所暗示的那样,这类似于将日期存储为字符串-您失去了使用正确数据类型会给您带来的优势和类型安全性,并添加了额外的痛苦、不确定性和开销,却没有任何好处。
问题实际上并不是CLOB相对于BLOB在存储字符数据方面的优势,而是反过来:BLOB相对于CLOB在存储字符数据方面有什么优势?通常情况下,答案是没有。
@Boneist提到了将JSON存储为BLOB的建议,有关此建议的更多信息可以在这里找到。
我能想到的唯一其他原因是,您必须存储来自多个源字符集的数据,并希望完全保留它们。但是,要么您仅存储这些数据,并且永远不会在数据库内部检查或操作数据,只会将其返回给某个外部应用程序而不加修改;在这种情况下,您不关心字符集 - 因此,您处理的是纯二进制数据,根本不应将其视为字符数据,就像您不关心存储的图像是PNG还是JPG等一样。要么您将需要使用这些数据,因此必须记录每个BLOB对象表示哪个字符集,以便根据需要进行转换。

谢谢。这在一定程度上有所帮助,并指出了数据库字符集在CLOB / varchar与BLOB /二进制存储中的作用。这也突出了一些特殊情况,需要使用BLOB而不是CLOB。 - Shailesh Pratapwar
1
存储和管理JSON数据概述中提到:“在AL32UTF8数据库中,CLOB实例使用UCS2字符集存储” - 这是真的吗?UCS-2只能表示BMP字符,因此不是“支持Unicode”的。UCS-2已经过时,我想Oracle仍然在参考它。 - Wernfried Domscheit
是的,不太确定;这个链接也没有什么帮助。我决定不再深入研究JSON的东西,但是想提一下,因为Boneist指出了它——我被“通常情况下没有”所迷惑,也不确定“通常情况下”的含义,但认为如果有合法而又不太常见的用法,肯定会有人指出。(如果有更多想到的用法,欢迎添加!) - Alex Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接