pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
bytea数据类型允许存储二进制串,参见表 8.6。
表 8.6. 二进制数据类型
| 名字 | 存储尺寸 | 描述 |
|---|---|---|
bytea |
1或4字节外加真正的二进制串 | 变长二进制串 |
二进制串是八位组(或字节)的序列。二进制串与字符串有两点区别。首先,二进制串明确允许存储值为零的字节以及其他“不可打印”的字节(通常指 32 到 126 范围之外的字节)。而字符串不允许零字节,也不允许那些按数据库所选字符集编码看属于非法的其他字节值或字节序列。其次,对二进制串的操作处理的是实际字节,而字符串的处理则取决于区域设置。简单地说,二进制串适合存储程序员视为“裸字节”的数据,而字符串适合存储文本。
在SQL语句中把bytea值用作字符串常量的一部分时,某些值的字节必须转义(但所有字节值都可以转义)。一般而言,要转义一个字节,需要把它转换为三位八进制值并在前面加上两个反斜线。表 8.7展示了必须转义的字符,并给出了适用的替代转义序列。
表 8.7. bytea输入转义字节
| 十进制字节值 | 描述 | 转义输入表示 | 示例 | 输出表示 |
|---|---|---|---|---|
| 0 | 零字节 | E'\\000' |
SELECT E'\\000'::bytea; |
\000 |
| 39 | 单引号 | ''''或E'\\047' |
SELECT E'\''::bytea; |
' |
| 92 | 反斜线 | E'\\\\'或E'\\134' |
SELECT E'\\\\'::bytea; |
\\ |
| 0 到 31 以及 127 到 255 | “不可打印”字节 | E'\\(八进制值) |
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输出转义字节
| 十进制字节值 | 描述 | 转义输出表示 | 示例 | 输出结果 |
|---|---|---|---|---|
| 92 | 反斜线 | \\ |
SELECT E'\\134'::bytea; |
\\ |
| 0 到 31 以及 127 到 255 | “不可打印”字节 | \(八进制值) |
SELECT E'\\001'::bytea; |
\001 |
| 32 到 126 | “可打印”字节 | 客户端字符集表示 | SELECT E'\\176'::bytea; |
~ |
取决于你所使用的 PostgreSQL 前端, 在转义和反转义 bytea 串时可能还需要做额外工作。 例如,如果你的接口会自动转换换行和回车,那么你可能还需要对它们 进行转义。
SQL标准定义了一种不同的二进制串类型,叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。