【发布时间】:2019-09-05 04:31:38
【问题描述】:
我想知道 Oracle 的 CLOB 在 BLOB 数据类型上提供了什么。 Both 的数据存储限制为 (4 GB - 1) * DB_BLOCK_SIZE。
超过 4000 字节的文本字符串无法放入 VARCHAR2 列。现在,我也可以使用 CLOB 和 BLOB 来存储这个字符串。
每个人都说,CLOB 很好,适用于字符数据,而 BLOB 则适用于二进制数据,例如图像、非结构化文档。
但我发现我也可以将字符数据存储在 BLOB 中。
我想知道的:
那么,问题在于基础知识,为什么是 CLOB,为什么不总是 BLOB?和编码有什么关系吗?
问题的标题应该是,CLOB 处理字符数据的方式与 BLOB 不同?
【问题讨论】:
-
在带有 blob 列的表上运行
select * from ...,然后快速告诉我 BLOB 中的文本是什么。如果您看不懂,请告诉我使用哪种编码来存储字节,如果您想将原始字节转换回可读字符串,您必须知道这一点。 -
为什么不使用 CLOB 来存储字符数据?这就像将日期存储在 DATE 列中,将数值存储在 NUMBER 列中:为您要存储的数据使用最合适的数据类型。
-
REGEXP_xxx、SUBSTR、xPAD、xTRIM等所有与字符串相关的函数仅适用于CLOB,但不适用于BLOB。为什么你会考虑将字符数据存储在BLOB中? -
@ShaileshPratapwar - 不,这个答案(无论如何都是不完整的,不确定它是如何得到这么多赞成的)最多只能给你从 BLOB 中选择的字节,而不是字符。该选择可能代表字符,如果您知道它们代表什么字符集以便您可以转换它们;但如果它们来自多字节字符集,您可能会将单个字符分成两半并且无论如何都无法转换它。 (或者转换错误,不注意。)
-
FWIW,Oracle 建议将 JSON(即文本)存储为 BLOB 数据类型:search for "Considerations When Using LOB Storage for JSON Data",并列出了一些原因;主要围绕字符集转换和大小。