↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 9.0 已结束支持。 2015-10-08. 请参阅 当前版本手册.

8.4. 二进制数据类型 #

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

表 8.6. 二进制数据类型

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

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

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

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

8.4.1. bytea hex format

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

例如:

SELECT E'\\xDEADBEEF';

8.4.2. bytea escape format

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

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

表 8.7. bytea Literal Escaped Octets

Decimal Octet ValueDescriptionEscaped Input RepresentationExampleOutput Representation
00字节'\000'SELECT '\000'::bytea;\x00
39单引号''''或'\047'SELECT ''''::bytea;\x27
92反斜线'\\'或'\134'SELECT '\\'::bytea;\x5c
0 to 31 and 127 to 255“non-printable” octetsE'\\xxx' (octal value)SELECT E'\\001'::bytea;\001

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

表 8.7中之所以需要多个反斜线,是因为写成字符串常量的输入串在PostgreSQL服务器中必须经过两个解析阶段。每一对中的第一个反斜线会被字符串常量解析器解释为转义字符(假定使用转义字符串语法)并因此被消耗,留下该对中的第二个反斜线。(可以使用美元引用的字符串来避免这一层转义。)剩下的反斜线随后被bytea输入函数识别为三位八进制值的开始,或者对另一个反斜线的转义。例如,以E'\001'形式传给服务器的字符串常量,在经过转义字符串解析器之后变成\001。然后\001被送到bytea输入函数,在那里它被转换为十进制值为 1 的单个字节。注意,单引号字符不会被bytea特殊对待,因此它遵循字符串常量的正常规则。(另见第 4.1.2.1 节。)

Bytea字节在输出时有时会被转义。通常,每个“不可打印”字节都会被转换为等价的三位八进制值并冠以一个反斜线。多数“可打印”字节按其在客户端字符集中的标准表示输出。十进制值为 92(反斜线)的字节在输出时会被双写。细节见表 8.8。

表 8.8. bytea Output Escaped Octets

Decimal Octet ValueDescriptionEscaped Output RepresentationExampleOutput Result
92反斜线\\SELECT E'\\134'::bytea;\\
0 to 31 and 127 to 255“non-printable” octets\xxx (octal value)SELECT E'\\001'::bytea;\001
32 到 126“可打印”字节客户端字符集表示SELECT E'\\176'::bytea;~

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.