【问题标题】:Oracle CLOB vs BLOBOracle CLOB 与 BLOB
【发布时间】: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_xxxSUBSTRxPADxTRIM 等所有与字符串相关的函数仅适用于 CLOB,但不适用于 BLOB。为什么你会考虑将字符数据存储在BLOB 中?
  • @ShaileshPratapwar - 不,这个答案(无论如何都是不完整的,不确定它是如何得到这么多赞成的)最多只能给你从 BLOB 中选择的字节,而不是字符。该选择可能代表字符,如果您知道它们代表什么字符集以便您可以转换它们;但如果它们来自多字节字符集,您可能会将单个字符分成两半并且无论如何都无法转换它。 (或者转换错误,不注意。)
  • FWIW,Oracle 建议将 JSON(即文本)存储为 BLOB 数据类型:search for "Considerations When Using LOB Storage for JSON Data",并列出了一些原因;主要围绕字符集转换和大小。

标签: oracle blob


【解决方案1】:

我想知道BLOB是如何处理字符类型数据的。

它不将其视为字符类型数据,它仅将其视为字节流 - 它不知道也不关心它代表什么。

From the documentation:

BLOB 数据类型存储非结构化二进制大对象。 BLOB 对象可以被认为是没有字符集语义的比特流。


clob 是否将条件信息与它一起存储并在检索数据时使用它?

不明确,但数据存储在数据库字符集中,与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 的内容。

(我能想到的唯一其他原因是您必须存储来自多个源字符集的数据,并希望完全按照您收到它们的方式保存它们。但是要么您是 only 存储它们并且永远不会检查或操作来自数据库本身的数据,只会将它们原封不动地返回给某些外部应用程序;在这种情况下,您不关心字符集 - 所以您处理的是纯二进制数据和根本不应该将其视为字符数据,就像您关心您存储的图像是 PNG 与 JPG 之类的一样。否则您将需要处理数据,因此必须记录每个 BLOB 对象代表的字符集,可以根据需要进行转换。)

【讨论】:

  • 谢谢。这在一定程度上有所帮助,并指出了数据库字符集在 CLOB/varchar 与 BLOB/二进制存储中的作用。这也突出了一些特殊情况,何时使用 BLOB 而不是 CLOB。
  • Overview of Storing and Managing JSON Data 中说:“在 AL32UTF8 数据库中,CLOB 实例使用 UCS2 字符集存储”——真的吗? UCS-2 只能表示BMP 字符,因此不能表示“Unicode-capable”。 UCS-2 是 obsolete,我发现 Oracle 仍然引用它。
  • 是的,不确定; this 也没有多大帮助。我决定不再深入研究 JSON 的内容,只是想像 Boneist 指出的那样提及它——我很想停在“通常没有”,我不确定“通常”,但是认为如果使用模糊,有人会指出合法的。 (如果/当人们想到它们时,很高兴添加更多内容!)
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 2013-12-11
  • 1970-01-01
  • 2010-11-04
  • 2011-04-10
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多