Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 在 SQL Anywhere 中创建数据库 » 设计注意事项 » 选择列数据类型

 

存储 BLOB

BLOB 是未经解释的字节串或字符串,作为值存储在列中。常见的 BLOB 示例有图片文件或声音文件。由于 BLOB 通常都很大,所以可将它们以任何字符串或二进制字符串数据类型(如 CHAR、VARCHAR、NCHAR、BINARY、VARBINARY 等等)的形式进行存储。根据需要存储的 BLOB 的内容和长度来选择数据类型和长度。

注意

通常将字符大对象称作 CLOB,将二进制大对象称作 BLOB,将二者的组合称作 LOB。在本文档中仅使用首字母缩写词 BLOB。

在创建一列以存储 BLOB 值时,您可以控制存储的各个方面。例如,可以指定将不超过指定大小的 BLOB 存储在行中(内置),而将超过指定大小的 BLOB 存储在表扩展页中行以外的位置。此外,您还可以指定,对于存储在行以外位置的 BLOB,该 BLOB 的前 n 个字节(也称作前缀)也会存储在行中。这些存储方面由在 CREATE TABLE 和 ALTER TABLE 语句中指定的 INLINE 和 PREFIX 设置来控制。您为这些设置指定的值会对性能或磁盘存储需求产生意想不到的影响。

如果 INLINE 和 PREFIX 都未指定,或者指定了 INLINE USE DEFAULT 或 PREFIX USE DEFAULT,则如下所述应用缺省值:

  • 对于字符数据类型列(如 CHAR、NCHAR、LONG VARCHAR 和 XML),INLINE 的缺省值为 256,PREFIX 的缺省值为 8。

  • 对于二进制数据类型列(如 BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING 和 UUID),INLINE 的缺省值为 256,PREFIX 的缺省值为 0。

建议您不要设置 INLINE 和 PREFIX 值,除非缺省值无法满足某些特定要求。选择缺省值可以在性能和磁盘空间需求之间获得均衡。例如,如果将 INLINE 设置为较大值,并且所有 BLOB 都被内置存储,则行处理性能可能会下降。如果将 PREFIX 值设置得过大,则会增加存储 BLOB 所需的磁盘空间量,因为前缀数据会复制 BLOB 的一部分内容。

如果您确实决定设置 INLINE 或 PREFIX 值,则 INLINE 的长度不得超过列的长度。同样,PREFIX 的长度不得超过 INLINE 的长度。

压缩列的前缀数据未经压缩存储,因此如果满足请求所需的所有数据都存储在前缀中,则不必进行解压缩。

有关 INLINE 和 PREFIX 子句的缺省值的信息,请参见CREATE TABLE 语句

BLOB 共享

如果 BLOB 超过了内置大小,并且需要多个数据库页面才能存储它,则数据库服务器会存储该 BLOB,这样,同一表中的其它行能够在需要时引用该 BLOB。这称作 BLOB 共享。BLOB 共享在内部处理,用于减少数据库中不必要的 BLOB 复制。

仅当您将一列的值设置为等于另一列的值时,才会发生 BLOB 共享。例如,UPDATE t column1=column2;。在本示例中,如果 column2 包含 BLOB,则在 column1 中不会复制这些 BLOB,而是使用指向 column2 中这些值的指针。

当某个 BLOB 被共享时,数据库服务器会对到该 BLOB 的其它引用数目加以跟踪。一旦数据库服务器确定某个 BLOB 在表内不再被引用,该 BLOB 即被删除。

如果某个 BLOB 在两个未压缩的列之间共享,然后其中的一个列被压缩,则该 BLOB 将不再被共享。