oracle - Oracle CLOB 与 BLOB
问题描述
我想知道 Oracle 的 CLOB 对 BLOB 数据类型提供了什么。 两者的数据存储限制为 (4 GB - 1) * DB_BLOCK_SIZE。
长度超过 4000 个字节的文本字符串不能放入 VARCHAR2 列。现在,我也可以使用 CLOB 和 BLOB 来存储这个字符串。
每个人都说,CLOB 很好,适用于字符数据,而 BLOB 则适用于二进制数据,例如图像、非结构化文档。
但我看到我也可以将字符数据存储在 BLOB 中。
我想知道的:
所以,问题是关于基础的,为什么是 CLOB,为什么不总是 BLOB?和编码有什么关系吗?
可能问题标题应该是,CLOB 如何以不同于 BLOB 的方式处理字符数据?
解决方案
我想知道 BLOB 如何处理字符类型数据。
它不将其视为字符类型数据,它仅将其视为字节流——它不知道也不关心它代表什么。
从文档中:
BLOB 数据类型存储非结构化二进制大对象。BLOB 对象可以被认为是没有字符集语义的比特流。
clob 是否将 conding 信息与它一起存储并在检索数据时使用它?
不是显式的,但数据存储在数据库字符集中,与VARCHAR2
数据一样。再次从文档中:
CLOB 数据类型存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集,并且都使用数据库字符集。
您可能还注意到该dbms_lob
包具有在 CLOB 和 BLOB 数据类型之间进行转换的过程。对于这两个,您必须指定要使用的字符集。因此,如果您选择将字符数据存储为 BLOB,则在将其转换为 BLOB 时必须知道字符集,但也许更关键的是,您必须知道字符集才能将其转换回来。你可以这样做,但这并不意味着你应该这样做。在您尝试将其转换为字符串之前,您无法验证 BLOB 数据。
正如@APC 所暗示的那样,这类似于将日期存储为字符串 - 您会失去使用正确数据类型会给您带来的优势和类型安全性,反而会增加额外的痛苦、不确定性和开销,而没有任何好处。
问题不在于 CLOB 在存储字符数据方面比 BLOB 有什么优势。问题实际上是相反的:在存储字符数据方面,BLOB 比 CLOB 有什么优势?答案通常是没有。
@Boneist 提到了将 JSON 存储为 BLOB 的建议,这里有更多相关信息。
(我能想到的唯一其他原因是您必须存储来自多个源字符集的数据,并希望完全按照您收到的方式保存它们。但是要么您只是存储它们并且永远不会检查或操作来自数据库本身的数据,并且只会将它们原封不动地返回给某些外部应用程序;在这种情况下,您不关心字符集-因此您处理的是纯二进制数据,不应将其视为字符数据根本不关心您存储的图像是 PNG 还是 JPG 之类的。或者您将需要处理数据,因此必须记录每个 BLOB 对象代表的字符集,所以您可以根据需要转换。)
推荐阅读
- python - 尽管在 os.environ 中设置了代理,但 Cartopy 无法下载代理后面的数据
- php - 记录所有 API 请求和响应 + Slim 框架
- r - 未经授权:需要身份验证 - 尝试拉取或运行公共图像
- java - hibernate中的LEFT JOIN表映射
- angular - 无法显示数据表中的数据
- android - 更改应用程序名称后,我无法在手机上调试。[安卓]
- c++ - 以参数为指针的模拟函数
- gcc - STM32 + GCC v8 + Qt Creator + Qbs:在 __libc_init_array 中崩溃
- android - 在 gradle 中创建具有多个 aar 文件作为依赖项的顶级“aar”
- python - 问题 Telethon python 库 - (TELEGRAM)