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

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 7.4 已结束支持。 请参阅 当前版本手册.

8.4. 二进制数据类型 #

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

表 8.6. 二进制数据类型

名字存储尺寸描述
bytea4字节外加实际的二进制串变长二进制串

二进制串是字节(八位组)的序列。二进制串与字符串的区别在于两个特性:第一,二进制串明确允许存储值为零的字节和其他“不可打印”字节(定义为 32 到 126 范围之外的字节)。第二,对二进制串的操作处理实际的字节,而字符串的编码和处理依赖于区域设置。

输入 bytea 值时,在 SQL 语句中作为字符串字面量的一部分使用时,某些值的字节必须转义(但所有字节值都可以转义)。一般而言,转义一个字节时,把它转换为等于其十进制字节值的三位八进制数,并在前面加两个反斜杠。表 8.7列出了必须转义的字符,并在适用处给出了替代的转义序列。

表 8.7. bytea输入转义字节

十进制字节值描述转义输入表示示例输出表示
00字节'\\000'SELECT '\\000'::bytea;\000
39单引号'\''或'\\047'SELECT '\''::bytea;'
92反斜线'\\\\'或'\\134'SELECT '\\\\'::bytea;\\
0 到 31 以及 127 到 255“不可打印”字节'\\xxx'(八进制值)SELECT '\\001'::bytea;\001

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

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

Bytea字节在输出时也会被转义。通常,每个“不可打印”字节都会被转换为等价的三位八进制值并冠以一个反斜线。多数“可打印”字节按其在客户端字符集中的标准表示输出。十进制值为 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 串时可能还需要做额外工作。例如,如果你的接口会自动转换换行和回车,那么你可能还需要对它们进行转义。

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

报告文档问题

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