2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

8.4. 二进制数据类型 #

bytea 数据类型允许存储二进制字符串;请参阅 表 8.6

表 8.6. 二进制数据类型

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

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

bytea 类型支持两种输入输出格式:“十六进制”格式和 PostgreSQL 传统的“转义”格式。这两种格式在输入时总是被接受的。输出格式取决于配置参数 bytea_output;默认是十六进制。 (请注意,十六进制格式是在 PostgreSQL 9.0 中引入的;早期版本和某些工具不理解它。)

SQL标准定义了一种不同的二进制字符串类型,称为 BLOBBINARY LARGE OBJECT。其输入格式与 bytea 不同,但提供的函数和运算符大部分相同。

8.4.1. bytea 十六进制格式 #

“十六进制”格式将二进制数据编码为每字节 2 个十六进制数字,高位在前。整个字符串前面是序列 \x(以区别于转义格式)。在某些上下文中,开头的反斜杠可能需要通过加倍来转义(参见 第 4.1.2.1 节)。对于输入,十六进制数字可以是大小写字母,并且数字对之间允许有空格(但数字对内部或开头的 \x 序列中不允许)。十六进制格式与各种外部应用程序和协议兼容,并且转换速度通常比转义格式快,因此推荐使用它。

示例:

SET bytea_output = 'hex';

SELECT '\xDEADBEEF'::bytea;
   bytea
------------
 \xdeadbeef

8.4.2. bytea 转义格式 #

“转义”格式是 PostgreSQL 传统的 bytea 类型格式。它将二进制字符串表示为一系列 ASCII 字符,同时将不能表示为 ASCII 字符的字节转换为特殊的转义序列。如果从应用程序的角度来看,将字节表示为字符是有意义的,那么这种表示可能很方便。但实际上它通常会引起混淆,因为它模糊了二进制字符串和字符字符串之间的区别,并且选择的特定转义机制也有些笨拙。因此,对于大多数新应用程序,应避免使用此格式。

在输入转义格式的 bytea 值时,某些值的八位字节必须被转义,而所有八位字节值可以被转义。通常,要转义一个八位字节,将其转换为其三位八进制值,并在前面加上反斜杠。反斜杠本身(八位字节十进制值 92)也可以用双反斜杠表示。表 8.7 显示了必须转义的字符,并给出了适用的替代转义序列。

表 8.7. bytea 字面量转义八位字节

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

转义不可打印八位字节的要求取决于区域设置。在某些情况下,您可以省略它们而不进行转义。

正如 表 8.7 中所示,单引号必须加倍的原因是,对于 SQL 命令中的任何字符串字面量,都是如此。通用的字符串字面量解析器会消耗最外层的单引号,并将成对的单引号减少为一个数据字符。bytea 输入函数看到的是一个单引号,它将其视为普通数据字符。但是,bytea 输入函数将反斜杠视为特殊字符,表 8.7 中显示的其余行为由该函数实现。

在某些上下文中,反斜杠必须加倍,这与上面所示的不同,因为通用的字符串字面量解析器也会将成对的反斜杠减少为一个数据字符;请参见 第 4.1.2.1 节

Bytea 八位字节默认以 hex 格式输出。如果将 bytea_output 改为 escape,则不可打印的八位字节会被转换为其等效的三位八进制值,并在前面加上一个反斜杠。大多数可打印的八位字节以其在客户端字符集中的标准表示形式输出,例如:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T

十进制值为 92 的八位字节(反斜杠)在输出时会被加倍。详细信息请参见 表 8.8

表 8.8. bytea 输出转义八位字节

十进制八位字节值 描述 转义输出表示 示例: 输出结果
92 反斜杠 \\ '\134'::bytea \\
0 至 31 和 127 至 255 不可打印八位字节 \xxx (八进制值) '\001'::bytea \001
32 至 126 可打印八位字节 客户端字符集表示 '\176'::bytea ~

根据您使用的 PostgreSQL 前端,您可能需要在转义和取消转义 bytea 字符串方面做额外的工作。例如,如果您的接口自动转换换行符和回车符,您可能还需要对它们进行转义。

提交更正

如果您在文档中看到任何不正确、与您对特定功能的实际体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。