二进制类数据类型
Blob(二进制大对象)具有复杂的结构,用于存储一个未定义长度的文本和二进制数据的,通常非常大.
语法:
BLOB [SUB_TYPE <subtype>]
[SEGMENT SIZE <segment size>]
[CHARACTER SET <character set>]
缩略语法:
BLOB [SUB_TYPE <subtype>]
[SEGMENT SIZE <segment size>]
[CHARACTER SET <character set>]
段大小:当用于处理应用程序由C语言写的BLOB 数据 (嵌入式 SQL) 及gpre预编译器带的帮助时,指定的 BLOB 段是倒退到过去的时代。现在,它实际上是无关紧要的。BLOB数据段的大小是由客户端决定的且通常在任何情况下比数据页面大小大得多。
二进制子类型
可选的 SUB_TYPE 参数指定写入列中的数据的性质,Firebird提供两个预定义子类型用于存储用户数据的︰
子类 0:二进制:如果不指定子类型,则该规范假定为非类型化数据和应用默认SUB_TYPE 0。子类零的别名是BINARY。这是由子类型来规定的,当数据是任意形式的二进制文件或流:图像,音频,字处理器文件,PDF文件等等。
子类 1:文本:子类1有个别名是TEXT,它能应用于声明和定义.例如:BLOB SUB_TYPE TEXT.它规定了子类用于存储纯文本数据,也就是太在了不适合放进一个字符串类型,可以指定字符集,如果该字段存储不同于数据库指定的编码格式的文本。从Firebird2.0开始,COLLATE子句也被支持。
自定义子类型:它也是可能为其添加自定义数据类型的范围从-1 到枚举-32768 被保留。正数的列举的自定义子类型不允许,因为Firebird引擎使用了从数字从 2 向上的数在元数据中用于一些内部的子类型。
二进制数据类型特性
大小:一个BLOB的字段最大空间被限定为4GB,无论服务器是否是 32 位或 64 位.(相关的Blob内部结构维护自己的4字节计数器),对于一个4 KB的页面大小(4096字节)的最大大小是低略小于2GB。
操作和表达式 ︰ 任何长度和任何字符集的文本 Blob — — 包括多字节 — — 可以几乎为任何语句或内部函数的操作数。完全支持下列运算符 ︰
= (赋值)
=, <>, <, <=, >, >= (比较)
|| (联接)
BETWEEN, IS [NOT] DISTINCT FROM,
IN, ANY|SOME,
ALL
部分支持:
•发生错误,如果这些搜索参数是大于或等于32 KB:
STARTING [WITH], LIKE,
CONTAINING
•聚合子句工作不是在这个字段的内容本身,但在 BLOB ID在。除此之外,有一些怪异:
SELECT DISTINCT错误地返回几个 NULL 值,如果它们呈现由
ORDER BY —
GROUP BY 连接相同的且彼此相邻的字符串,而它们彼此不相邻时则不会发生这个错误.
BLOB存储
• 默认情况下,为每个 BLOB 创建整齐的的记录,它存储在分配给它的数据页上。如果整个 BLOB 适合到此页上,它被称为水平 0 BLOB。这个特殊的记录的编号存储在表记录中占用 8 个字节。
• 如果 BLOB 不能放到一个数据页,其内容放到单独的页面专门分配给它(blob 页),而这些页面数目则存储到 BLOB 记录。这是一个第1级 BLOB。
• 如果页码包含 BLOB 数据的数组不能放到数据页,该数组是放单独的 blob 页,而这些页面的数字放入 BLOB 记录。这是一个第2级 BLOB。
• 不支持高于2的级别。
参阅: FILTER, DECLARE FILTER
数组类型
Firebird DBMS 中的数组的支持是背离了传统的关系模型。在DBMS中支持数组可以更容易地解决一些涉及大型类似数据集的数据处理任务。
数组在Firebird数据库存储在一种特殊的BLOB类型中。数组可以是一维和多维任何数据类型除了 BLOB 和ARRAY数据类型这外。
例子:
CREATE TABLE SAMPLE_ARR (
ID INTEGER NOT NULL PRIMARY KEY,
ARR_INT INTEGER [4]);
此示例将创建一个表的四个整数组成的数组类型的字段。这下标数组是从 1 到 4。
为维度指定显式的边界
默认情况下,维度是基于 1 的 — — 从 1 编号下标。要显式指定下标的值的上限和下限的界限,请使用以下语法 ︰
[<lower>:<upper>]
添加更多的维度
在语法中的逗号后添加新的维度。在此示例中,我们用二维数组创建一个表,这个数组的两个维度的下标下限从零开始:
CREATE TABLE SAMPLE_ARR2 (
ID INTEGER NOT NULL PRIMARY KEY,
ARR_INT INTEGER [0:3, 0:3]);
DBMS 不提供太多的语言或工具,用于处理数组的内容。在Firebird的任何分发包的../examples/empbuild目录找到employee.fdb 数据库,它包含一个示例存储过程,显示数组的一些简单工作:
一个涉及到数级调用的SHOW_LANGS存储过程的PSQL源码:
CREATE OR ALTER PROCEDURE SHOW_LANGS (
CODE VARCHAR(5),
GRADE SMALLINT,
CTY VARCHAR(15))
RETURNS (LANGUAGES VARCHAR(15))
AS
DECLARE VARIABLE I INTEGER;
BEGIN
I = 1;
WHILE (I <= 5) DO
BEGIN
SELECT LANGUAGE_REQ[:I]
FROM JOB
WHERE (JOB_CODE = :CODE)
AND (JOB_GRADE = :GRADE)
AND (JOB_COUNTRY = :CTY)
AND (LANGUAGE_REQ IS NOT NULL))
INTO :LANGUAGES;
IF (LANGUAGES = '') THEN
/* PRINTS 'NULL' INSTEAD OF BLANKS */
LANGUAGES = 'NULL';
I = I +1;
SUSPEND;
END
END
如果描述的特征是足够对您的任务面言,你可以考虑在您的项目中使用数组。目前,没有改进计划加强对Firebird的数组的支持。