版本说明:Oracle 11g
今天再次与BLOB、CLOB相逢,此前没有详细的去文档查看,现将文档Oracle Database SQL Language ReferenceLOB部分的内容整理如下。
Large Object (LOB) Data Types
内置的LOB数据类型BLOB
,CLOB
和NCLOB
(内部存储)和BFILE
(外部存储)可以存储大量的、非结构化的数据,例如文本,图像,视频,数据和空间数据。BLOB
,CLOB
以及NCLOB
数据可高达(2^32 -1个字节)*(LOB存储的参数CHUNK
的值)。如果数据库中的表空间是标准块大小,并且在创建LOB列时CHUNK
使用了LOB存储参数的缺省值,那么这相当于(2^32 -1字节)*(数据库块大小) 。尽管您的操作系统可能会对此最大值加以限制,但BFILE
数据最多可达2^64个字节。
在创建表时,您可以选择为LOB列或LOB对象属性指定不同的表空间和存储特性,以及为表指定的属性。
如果您在创建LOB列时启用行存储,那么CLOB、NCLOB和BLOB值最多内联存储4000个字节。大于4000字节的LOB始终存储在外部。有关更多信息,请参阅ENABLE STORAGE IN ROW。
LOB列包含可以引用内部(数据库中)或外部(数据库外)LOB值的LOB定位器。从表中选择LOB实际上返回LOB定位器,而不是整个LOB值。在lob上的DBMS_LOB包和Oracle Call Interface (OCI)操作是通过这些定位器执行的。
LOB类似于LONG
和LONG
RAW
类型,但在以下方面有所不同:
-
LOB可以是对象类型(用户定义的数据类型)的属性。
-
LOB定位器存储在表列中,包含或不包含实际的LOB值。BLOB、NCLOB和CLOB值可以存储在单独的表空间中。BFILE数据存储在服务器上的一个外部文件中。
-
访问LOB列时,将返回定位器。
-
LOB的大小可以达到(2^32-1字节)*(数据库块大小)。BFILE数据最多可达2^64-1字节,不过您的操作系统可能会对这个最大值加以限制。
-
LOB允许高效,随机,分段访问和操纵数据。
-
您可以在表中定义多个LOB列。
-
除了之外
NCLOB
,您可以在对象中定义一个或多个LOB属性。 -
您可以声明LOB绑定变量。
-
您可以选择LOB列和LOB属性。
-
您可以插入新行或更新包含一个或多个LOB列的现有行或具有一个或多个LOB属性的对象。在更新操作中,您可以将内部LOB值设置为
NULL
,清空或用数据替换整个LOB。您可以设置BFILE
到NULL
或使其指向不同的文件。 -
您可以使用另一个LOB行列交集或LOB属性更新LOB行列交集或LOB属性。
-
您可以删除包含LOB列或LOB属性的行,从而也删除LOB值。对于BFILE,不删除实际的操作系统文件。
只需发出INSERT或UPDATE语句,就可以访问和填充内联LOB列(存储在数据库中的LOB列)或LOB属性(存储在数据库中的对象类型列的属性)的行。
LOB列的限制
LOB列受许多规则和限制的约束。有关完整列表,请参阅Oracle Database SecureFiles和Large Objects Developer's Guide。
也可以参考:
有关这些接口和LOB的更多信息,请参考Oracle Database PL/SQL Packages and Types Reference和“Oracle Call Interface Programmer's Guide”
有关将列转换为LOB列的更多信息,请参考ALTER TABLE和TO_LOB的
modify_col_properties
子句LONG
BFILE数据类型
BFILE数据类型允许访问存储在Oracle数据库外部文件系统中的二进制文件lob。BFILE列或属性存储BFILE定位器,该定位器用作指向服务器文件系统上二进制文件的指针。定位器维护目录名和文件名。
可以使用BFILENAME函数更改BFILE的文件名和路径,而不影响基表。有关此内置SQL函数的更多信息,请参阅BFILENAME。
二进制文件lob不参与事务,并且不可恢复。相反,底层操作系统提供文件完整性和持久性。BFILE数据最多可达2^64-1字节,不过您的操作系统可能会对这个最大值施加限制。
数据库管理员必须确保外部文件存在,并且Oracle进程对该文件具有操作系统读取权限。
BFILE数据类型启用对大型二进制文件的只读支持。您不能修改或复制这样的文件。Oracle提供api来访问文件数据。用于访问文件数据的主要接口是DBMS_LOB包和Oracle调用接口(OCI)。
也可以参考:
有关LOB和 CREATE DIRECTORY的更多信息,请参见 Oracle Database SecureFiles和Large Objects Developer's Guide and Oracle Call Interface Programmer's Guide
BLOB数据类型
BLOB数据类型存储非结构化的二进制大对象。BLOB对象可以看作没有字符集语义的位流。BLOB对象可以存储最多(4 gigabytes -1) * (LOB存储的CHUNK参数值)的二进制数据。如果数据库中的表空间是标准块大小,并且在创建LOB列时使用了LOB storage的CHUNK参数的默认值,那么这相当于(4 gigabytes -1) *(数据库块大小)。
BLOB对象支持完整的事务。通过SQL、DBMS_LOB包或Oracle调用接口(OCI)所做的更改将完全参与事务。可以提交和回滚BLOB值操作。但是,不能在一个事务中将BLOB定位器保存在PL/SQL或OCI变量中,然后在另一个事务或会话中使用它。
CLOB数据类型
CLOB数据类型存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集,并且都使用数据库字符集。CLOB对象可以存储最多(4 gigabytes -1) * (LOB存储的CHUNK参数的值)的字符数据。如果数据库中的表空间是标准块大小,并且在创建LOB列时使用了LOB存储的CHUNK参数的默认值,那么这相当于(4 gigabytes -1) *(数据库块大小)。
CLOB对象支持完整的事务。通过SQL、DBMS_LOB包或Oracle调用接口(OCI)所做的更改将完全参与事务。可以提交和回滚CLOB值操作。但是,不能在一个事务中将CLOB定位器保存在PL/SQL或OCI变量中,然后在另一个事务或会话中使用它。
NCLOB数据类型
NCLOB数据类型存储Unicode数据。支持固定宽度和可变宽度字符集,并且都使用国家字符集。NCLOB对象可以存储最多(4 gigabytes -1) * (LOB存储的CHUNK参数值)的字符文本数据。如果数据库中的表空间是标准块大小,并且在创建LOB列时使用了LOB存储的CHUNK参数的默认值,那么这相当于(4 gigabytes -1) *(数据库块大小)。
NCLOB对象支持的事务。通过SQL、DBMS_LOB包或OCI所做的更改完全参与事务。可以提交和回滚NCLOB值操作。但是,您不能在一个事务中将NCLOB定位器保存在PL/SQL或OCI变量中,然后在另一个事务或会话中使用它。
参考资料
Oracle Database SQL Language Reference
Tank
2019.7.29