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不同,但是提供的函数和操作符大多一样。
bytea的十六进制格式 #“十六进制”格式把二进制数据编码为每字节两个十六进制 数字,最高有效半字节在前。整个串以前缀 \x 开头(以便与转义格式区分)。在某些上下文中,这个开头的反斜线 可能需要通过双写进行转义(见 Section 4.1.2.1)。作为输入时,十六进制数字 可以使用大写或小写,并且在两个数字组成的一组之间允许出现空白 (但组内以及起始的 \x 序列中不能有空白)。 十六进制格式与大量外部应用和协议兼容,并且通常比转义格式转换得 更快,因此更推荐使用。
示例:
SET bytea_output = 'hex'; SELECT '\xDEADBEEF'::bytea; bytea ------------ \xdeadbeef
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 | “不可打印的”字节 | '\(八进制值) |
'\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 | “不可打印的”字节 | \(八进制值) |
'\001'::bytea |
\001 |
| 32到126 | “可打印的”字节 | 客户端字符集表示 | '\176'::bytea |
~ |
取决于你所使用的 PostgreSQL 前端, 在转义和反转义 bytea 串时可能还需要做额外工作。 例如,如果你的接口会自动转换换行和回车,那么你可能还需要对它们 进行转义。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。