|
3.4. 二进制字串bytea 数据类型允许存储二进制字串. 二进制字串是一个八进制数值的序列,没有与之关联的字符集或者对照表. Bytea 明确表示允许存储象零值以及其它 "不可打印" 的八进制数据. 如果把八进制数值用做 SQL 语句中的字串文本, 那么你 必须 逃逸某些数值(但 可以 逃逸所有八进制数值) 通常,要逃逸一个八进制数,需要把它的数值转换成对应的三位八进制数字, 并且前导两个反斜扛.有些八进制数值有可选的逃逸序列, 在 Table 3-7 中显示. Table 3-7. SQL 文本逃逸八进制
请注意上面的每个例子都是刚好一个八进制位长,虽然零的八进制和反斜扛 的八进制的输出形式比一个字符要长. Bytea 输出的八进制 也是经过逃逸的.通常,每个 "不可打印" 的八进制数字值 都转化成对应的前导反斜扛的三位八进制数值.大多数 "可打印的" 八进制是以客户端字符集的标准表现形式出现的.十进制值为 92 (反斜扛) 的八进制数有一个特殊的可选输出形式.细节在 Table 3-8 里描述. Table 3-8. SQL 输出逃逸序列
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 类型的比较
|