选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

8.4. 二进制数据类型 #

bytea数据类型允许存储二进制串,参见表 8.6

表 8.6. 二进制数据类型

名字 存储尺寸 描述
bytea 1或4字节外加真正的二进制串 变长二进制串

二进制串是八位组(或字节)的序列。二进制串与字符串有两点区别。 首先,二进制串明确允许存储值为零的字节以及其他不可打印 的字节(通常指十进制范围 32 到 126 之外的字节)。而字符串不允许 零字节,也不允许那些按数据库所选字符集编码看属于非法的其他字节值 或字节序列。其次,对二进制串的操作处理的是实际字节,而字符串的处理 则取决于区域设置。简单地说,二进制串适合存储程序员视为裸字节 的数据,而字符串适合存储文本。

bytea类型支持两种用于输入和输出的格式:十六进制格式和PostgreSQL的历史的转义格式。在输入时这两种格式总是会被接受。输出格式则取决于配置参数bytea_output,其默认值为十六进制(注意十六进制格式是在PostgreSQL 9.0中被引入的,早期的版本和某些工具无法理解它)。

SQL标准定义了一种不同的二进制串类型, 叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。

8.4.1. bytea的十六进制格式

十六进制格式把二进制数据编码为每字节两个十六进制 数字,最高有效半字节在前。整个串以前缀 \x 开头(以便与转义格式区分)。在某些上下文中,这个开头的反斜线 可能需要通过双写进行转义。作为输入时,十六进制数字 可以使用大写或小写,并且每两个数字组成一组,组与组之间允许出现空白 (但组内以及起始的 \x 序列中不能有空白)。 十六进制格式与大量外部应用和协议兼容,并且通常比转义格式转换得 更快,因此更推荐使用。

例如:

SELECT '\xDEADBEEF';

8.4.2. bytea的转义格式

转义格式是 bytea 类型在 PostgreSQL 中的传统格式。它采用把 二进制串表示为 ASCII 字符序列的方式,同时把那些不能表示为 ASCII 字符的字节转换为特殊的转义序列。如果从应用角度看,把字节 当作字符表示是合理的,那么这种表示法会比较方便。但在实际中它 往往让人困惑,因为它模糊了二进制串和字符串之间的区别,而且所选 用的转义机制也比较笨拙。因此,对大多数新应用来说,最好避免使用 这种格式。

在转义格式中输入 bytea 值时,某些字节值 必须转义,而所有字节值都 可以转义。通常,转义一个字节的方法是把它写成 三位八进制值,并在前面加一个反斜线。反斜线本身 (十进制字节值 92)也可以写成双反斜线。 表 8.7 展示了必须转义的字符,并给出 了可用的替代转义序列。

表 8.7. bytea字面量中需要转义的字节

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

是否必须转义这些不可打印字节,会因区域设置 不同而有所差异。在某些情况下,你可以不转义它们。请注意, 表 8.7 中每个示例的结果都恰好是 一个字节长,尽管其输出表示有时多于一个字符。

表 8.7 所示,之所以需要多个反斜线, 是因为以字符串常量形式书写的输入串在 PostgreSQL 服务器中要经过两个解析阶段。每一对反斜线中的第一个会被字符串常量解析器 (假定使用转义字符串语法)解释为转义字符并被消耗掉,留下这一对中的第二个 反斜线。(可以使用美元引用的字符串来避免这一层转义。)剩下的反斜线随后被 bytea 输入函数识别为三位八进制值的开始,或识别为对另一个 反斜线的转义。例如,作为 '\001' 传递给服务器的字符串常量, 在经过转义字符串解析器之后变成 \001。然后 \001 被发送到 bytea 输入函数,并在那里被 转换为十进制值为 1 的单个八位组。请注意,单引号字符不会被 bytea 特殊对待,因此它遵循字符串常量的普通规则。 (另见 第 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 反斜线 \\ SELECT '\134'::bytea; \\
0到31和127到255 不可打印的字节 \xxx(八进制值) SELECT '\001'::bytea; \001
32到126 可打印的字节 客户端字符集表示 SELECT '\176'::bytea; ~

取决于你所使用的 PostgreSQL 前端, 在转义和反转义 bytea 串时可能还需要做额外工作。 例如,如果你的接口会自动转换换行和回车,那么你可能还需要对它们 进行转义。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。