# 8.4.二进制数据类型

8.4.1.二进制数据十六进制格式

8.4.2.二进制数据转义格式

这个二进制数据数据类型允许存储二进制字符串;看见表8.6.

表8.6.二进制数据类型

名称 存储大小 描述
二进制数据 1或4字节加上实际的二进制字符串 可变长度二进制字符串

二进制字符串是八位字节(或字节)的序列。二进制字符串与字符串有两种区别。首先,二进制字符串特别允许存储值为零的八位字节和其他“不可打印”的八位字节(通常是十进制范围32到126之外的八位字节)。字符串不允许零个八位字节,也不允许任何其他八位字节值和根据数据库选定的字符集编码无效的八位字节值序列。其次,对二进制字符串的操作处理实际字节,而对字符串的处理取决于语言环境设置。简而言之,二进制字符串适用于存储程序员认为是“原始字节”的数据,而字符串适用于存储文本。

这个二进制数据类型支持两种输入和输出格式:“十六进制”格式和PostgreSQL的历史“转义”格式。在输入时,这两项都是可以接受的。输出格式取决于配置参数二进制数据_输出; 默认值为十六进制。(请注意,十六进制格式是在PostgreSQL 9.0中引入的;早期版本和一些工具不理解它。)

SQL标准定义了一种不同的二进制字符串类型,称为斑点二进制大对象.输入格式与二进制数据,但提供的函数和运算符基本相同。

# 8.4.1. 二进制数据十六进制格式

“十六进制”格式将二进制数据编码为每个字节2个十六进制数字,最重要的半字节在前。整个字符串前面是序列\x(以区别于转义格式)。在某些情况下,可能需要通过将初始反斜杠加倍来对其进行转义(请参见第4.1.2.1节).对于输入,十六进制数字可以是大写或小写,数字对之间允许有空格(但不在数字对内,也不在起始位置)\x顺序)。十六进制格式与广泛的外部应用程序和协议兼容,而且它的转换速度往往比转义格式更快,因此使用它是首选。

例子:

SELECT '\xDEADBEEF';

# 8.4.2. 二进制数据转义格式

“escape”格式是传统的PostgreSQL格式二进制数据类型它采用将二进制字符串表示为ASCII字符序列的方法,同时将无法表示为ASCII字符的字节转换为特殊转义序列。如果从应用程序的角度来看,将字节表示为字符是有意义的,那么这种表示可能很方便。但在实践中,它通常是令人困惑的,因为它模糊了二进制字符串和字符串之间的区别,而且所选择的特定转义机制有些笨拙。因此,对于大多数新应用程序,可能应该避免使用这种格式。

进入时二进制数据转义格式的值,特定值的八位字节必须被转义,而所有八位组值可以逃走了。一般来说,要转义八位字节,请将其转换为三位八进制值,并在其前面加一个反斜杠。反斜杠本身(八位十进制值92)也可以用双反斜杠表示。表8.7显示必须转义的字符,并在适用的情况下给出替代转义序列。

表8.7. 二进制数据字面逃逸八位组

十进制八进制值 描述 转义输入表示法 实例 十六进制表示法
0 八位组 '\000' “\000”:“拜茶” \x00
39 单引号 '''''\047' ''::拜茶 \x27
92 反斜杠 '\\''\134' “\\”::拜茶 \x5c
0到31和127到255 “不可打印”八位字节 '\*xxx'*(八进制值) “\001”:“拜茶” \x01

逃跑的要求不可打印八位字节因语言环境设置而异。在某些情况下,你可以让他们逍遥法外。

单引号必须加倍的原因,如中所示表8.7,这对于SQL命令中的任何字符串文本都是正确的。通用字符串文字解析器使用最外层的单引号,并将任何一对单引号减少为一个数据字符。怎么回事二进制数据输入函数sees只是一个单引号,它将其视为普通数据字符。然而二进制数据输入函数将反斜杠视为特殊行为,其他行为如中所示表8.7由该函数实现。

在某些上下文中,反斜杠必须比上面所示的加倍,因为通用字符串文字解析器还将把反斜杠对减少为一个数据字符;看见第4.1.2.1节.

拜茶八位字节以数字形式输出十六进制默认设置格式。如果你改变二进制数据_输出逃跑,将“不可打印”的八位字节转换为其等效的三位八进制值,前面加一个反斜杠。大多数“可打印”的八位字节都是以其在客户端字符集中的标准表示形式输出的,例如:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea