您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

3.4. 二进制字串

bytea 数据类型允许存储二进制字串.

Table 3-6. 二进制字串类型

类型名 存储 描述
bytea 4 字节加上实际的二进制字串 变长(没有明确长度限制)的二进制字串

二进制字串是一个八进制数值的序列,没有与之关联的字符集或者对照表. Bytea 明确表示允许存储象零值以及其它 "不可打印" 的八进制数据.

如果把八进制数值用做 SQL 语句中的字串文本, 那么你 必须 逃逸某些数值(但 可以 逃逸所有八进制数值) 通常,要逃逸一个八进制数,需要把它的数值转换成对应的三位八进制数字, 并且前导两个反斜扛.有些八进制数值有可选的逃逸序列, 在 Table 3-7 中显示.

Table 3-7. SQL 文本逃逸八进制

十进制数值 描述 输入逃逸表现形式 例子 打印结果
0 零的八进制 '\\000' select '\\000'::bytea; \000
39 单引号 '\\'' or '\\047' select '\''::bytea; '
92 反斜扛 '\\\\' or '\\134' select '\\\\'::bytea; \\

请注意上面的每个例子都是刚好一个八进制位长,虽然零的八进制和反斜扛 的八进制的输出形式比一个字符要长. Bytea 输出的八进制 也是经过逃逸的.通常,每个 "不可打印" 的八进制数字值 都转化成对应的前导反斜扛的三位八进制数值.大多数 "可打印的" 八进制是以客户端字符集的标准表现形式出现的.十进制值为 92 (反斜扛) 的八进制数有一个特殊的可选输出形式.细节在 Table 3-8 里描述.

Table 3-8. SQL 输出逃逸序列

十进制数值 描述 输出逃逸形式 例子 打印结果
92 反斜扛 \\ select '\\134'::bytea; \\
0 到 31 和 127 到 255 "不可打印" 八进制字符 \### (octal value) select '\\001'::bytea; \001
32 到 126 "可打印" 八进制字符 ASCII 表现形式 select '\\176'::bytea; ~

SQL 字串文本(输入字串)必须由两个反斜扛前缀, 因为它们必须通过 PostgreSQL 后端里的两个分析器.第一个反斜扛 被字串文本分析器解释成逃逸字符,于是被消耗掉,留下后面跟着的八进制. 剩下的反斜扛被 bytea 输入函数识别,它把它当做一个 三位的八进制数值前缀看待.比如,一个字串文本以 '\\001' 的形式传递给后端,在通过字串文本分析器之后就变成了 '\001' .然后 '\001' 被发送给 bytea 输入函数,被该函数转换成一个八进制数值为 1.

由于类似的原因,一个反斜扛必须以 '\\\\' 形式 输入(或者是 '\\134' ).第一个和第三个反斜扛被 字串文本分析器当做逃逸字符解释并消耗掉,字串里剩下两个反斜扛传递 给 bytea 输入函数,然后该函数把它转换成表示一个反斜扛. 比如,一个以 '\\\\' 形式传递给后端的字串文本 在通过字串文本分析器后变成 '\\' . 然后 '\\' 被发送给 bytea 输入函数,在那里它被转换成十进制数值为 92 的单个字符.

单引号略有不同,因为它必须以 '\'' (或者 '\\134' )形式输入, 而不是 '\\'' 形式.这是因为虽然文本分析器把单引号 解释成一个特殊的字符,并且将消耗掉一个反斜扛,但是 bytea 输入函数并 认为单引号 是一个特殊的八进制.因此,一个传递给后端的 '\'' 在通过字串文本分析器之后变成 ''' . 然后 ''' 被发送给 bytea 输入函数, 输入函数仍然把它转换成单个十进制值为 39 的字符.

根据你使用的前端的不同,在逃不逃逸 bytea 字串的问题上 你可能有一些额外的工作要做.比如,如果你的接口自动转换进行和回车, 那你可能还要逃逸它们.而如果你选的语言或者工具的分析器也把反斜扛 当逃逸字符看,那么你可能还要成倍地用它.

Bytea 提供了根据 SQL99 第 4.3 节提出的二进制字串的大部分 功能.SQL99 二进制字串和 PostgreSQL bytea 的比较在 Table 3-9 里面列出.

Table 3-9. SQL 99 二进制字串和 PostgreSQL BYTEA 类型的比较

SQL99 BYTEA
数据类型名为 BINARY LARGE OBJECT BLOB 数据类型名为 BYTEA
一个没有特定字符集或者对照表的八进制数序列 相同
由一种二进制数据类型描述符描述,该描述符包含数据类型名和 八进制形式的最大长度 由一种二进制数据类型描述符描述,该描述符包含数据类型名, 但是没有明确的最大长度
所有二进制字串根据比较谓词的规则都是相互可比的. 相同
二进制字串只能比较是否相等. 二进制字串可以进行是否相等,大于,大于或等于, 小于,小于或等于的比较.
操作符返回二进制字串的操作包括联接,子字串, 重叠和截断. 操作符返回二进制字串的操作包括联接,子字串,和截断 用于截断操作的 leading trailing 还未实现.
其它涉及二进制字串的操作包括测长,定位和 like 谓词 相同
二进制字串文本是以放在单引号中,前缀 "X" 的偶数位的十六进制数据进行比较的.比如 X'1a43fe' 二进制字串文本是以根据 Table 3-7 里的规则逃逸的 八进制字符比较的