受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

8.4. 二进制数据类型 #

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

Table 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 开头(以便与转义格式区分)。在某些上下文中,这个开头的反斜线 可能需要通过双写进行转义(见 Section 4.1.2.1)。作为输入时,十六进制数字 可以使用大写或小写,并且在两个数字组成的一组之间允许出现空白 (但组内以及起始的 \x 序列中不能有空白)。 十六进制格式与大量外部应用和协议兼容,并且通常比转义格式转换得 更快,因此更推荐使用。

示例:

SET bytea_output = 'hex';

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

8.4.2. bytea的转义格式 #

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

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

Table 8.7. bytea文字转义字节

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

是否必须转义这些不可打印字节,会因区域设置 不同而有所差异。在某些情况下,你可以不转义它们。

Table 8.7 所示,单引号必须成对 写出的原因,在于这对 SQL 命令中的任何字符串常量都成立。通用的 字符串常量解析器会去掉最外层单引号,并把任意成对的单引号缩减为 一个数据字符。因此,bytea 输入函数实际只会看到 一个单引号,并将其视为普通数据字符。不过, bytea 输入函数会把反斜线视为特殊字符,而 Table 8.7 中展示的其他行为也是由 这个函数实现的。

在某些上下文中,反斜线必须比上面显示的再多写一倍,因为通用的 字符串常量解析器也会把成对反斜线缩减为一个数据字符; 参见 Section 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(反斜线)的字节在输出中会被双写。详情见 Table 8.8

Table 8.8. bytea输出转义字节

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

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

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。