bytea
二进制数据(“字节数组”)
当前查看 PostgreSQL 18.6。
PG10–20 核心源码清单。类型转换与操作符类列出源码显式声明的关系;缺少记录不能排除通过其他机制进行转换或使用索引。
定义
二进制数据(“字节数组”)
bytea
- 目录名称
- pg_catalog.bytea
- 类型 OID
- 17
- 类型种类
- 基础类型
- 声明长度
- 变长(varlena)
- 存储策略
- 扩展
- 输入函数
- byteain
- 输出函数
- byteaout
- 手册中的声明
- bytea
- 存储大小
- 1 或 4 字节,加上实际二进制串
- 手册说明
- 变长二进制串
中文手册
阅读来源定义
8.4. 二进制数据类型
8.4. 二进制数据类型
bytea数据类型允许存储二进制串,参见表 8.6。
表 8.6. 二进制数据类型
| 名字 | 存储大小 | 说明 |
|---|---|---|
bytea |
1 或 4 字节,加上实际二进制串 | 变长二进制串 |
二进制串是八位组(或字节)的序列。二进制串与字符串有两点区别。首先,二进制串明确允许存储值为零的字节以及其他“不可打印”的字节(通常指十进制范围 32 到 126 之外的字节)。而字符串不允许零字节,也不允许那些按数据库所选字符集编码看属于非法的其他字节值或字节序列。其次,对二进制串的操作处理的是实际字节,而字符串的处理则取决于区域设置。简单地说,二进制串适合存储程序员视为“裸字节”的数据,而字符串适合存储文本。
bytea 支持两种输入/输出格式:hex 格式和 PostgreSQL 历史上使用的 escape 格式。输入始终接受这两种格式;输出格式由 bytea_output 配置参数决定,默认为 hex。(hex 格式从 PostgreSQL 9.0 开始引入,更早版本和部分工具无法识别。)
SQL标准定义了一种不同的二进制串类型,叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。
hex 格式将每个二进制字节编码为 2 个十六进制数字,高四位在前。整个字符串以 \x 开头,以区别于 escape 格式。在某些上下文中,开头的反斜杠需要重复一次进行转义,见第 4.1.2.1 节。输入时十六进制数字可以大写或小写,数字对之间允许空白,但每对数字内部以及开头的 \x 内部不允许空白。hex 格式兼容多种外部应用和协议,通常也比 escape 格式转换更快,因此推荐使用。
示例:
SET bytea_output = 'hex'; SELECT '\xDEADBEEF'::bytea; bytea ------------ \xdeadbeef
“转义”格式是 bytea 类型在 PostgreSQL 中的传统格式。它采用把二进制串表示为 ASCII 字符序列的方式,同时把那些不能表示为 ASCII 字符的字节转换为特殊的转义序列。如果从应用角度看,把字节当作字符表示是合理的,那么这种表示法会比较方便。但在实际中它往往让人困惑,因为它模糊了二进制串和字符串之间的区别,而且所选用的转义机制也比较笨拙。因此,对大多数新应用来说,最好避免使用这种格式。
在转义格式中输入 bytea 值时,某些字节值必须转义,而所有字节值都可以转义。通常,转义一个字节的方法是把它写成三位八进制值,并在前面加一个反斜线。反斜线本身(十进制字节值 92)也可以写成双反斜线。表 8.7展示了必须转义的字符,并给出了可用的替代转义序列。
表 8.7. bytea字面量中需要转义的字节
| 十进制字节值 | 说明 | 转义输入表示 | 示例 | 十六进制表示 |
|---|---|---|---|---|
| 0 | 零值字节 | '\000' |
'\000'::bytea |
\x00 |
| 39 | 单引号 | ''''或'\047' |
''''::bytea |
\x27 |
| 92 | 反斜线 | '\\'或'\134' |
'\\'::bytea |
\x5c |
| 0 至 31 和 127 至 255 | “不可打印的”字节 | '\(八进制值) |
'\001'::bytea |
\x01 |
是否必须转义这些不可打印字节,会因区域设置不同而有所差异。在某些情况下,你可以不转义它们。
如表 8.7所示,单引号必须双写,这是 SQL 命令中所有字符串常量都遵循的规则。通用的字符串常量解析器会去掉最外层单引号,并把任意成对的单引号缩减为一个数据字符。因此,bytea 输入函数实际只会看到一个单引号,并将其视为普通数据字符。不过,bytea 输入函数会把反斜线视为特殊字符,而表 8.7中展示的其他行为也是由这个函数实现的。
在某些上下文中,反斜线必须比上面显示的再多写一倍,因为通用的字符串常量解析器也会把成对反斜线缩减为一个数据字符;参见第 4.1.2.1 节。
bytea 的八位组默认以十六进制格式输出。如果将 bytea_output 改为 escape,“不可打印”的八位组会转换为等价的三位八进制值,并在前面加一个反斜杠。大多数“可打印”的八位组则使用客户端字符集中的标准表示输出,例如:
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251T
十进制值 92(反斜线)的字节在输出中会被双写。详情见表 8.8。
表 8.8. bytea输出转义字节
| 十进制字节值 | 说明 | 转义的输出表示 | 示例 | 输出结果 |
|---|---|---|---|---|
| 92 | 反斜线 | \\ |
'\134'::bytea |
\\ |
| 0 至 31 和 127 至 255 | “不可打印的”字节 | \(八进制值) |
'\001'::bytea |
\001 |
| 32 至 126 | “可打印的”字节 | 客户端字符集表示 | '\176'::bytea |
~ |
取决于你所使用的 PostgreSQL 前端,在转义和反转义 bytea 串时可能还需要做额外工作。例如,如果你的接口会自动转换换行和回车,那么你可能还需要对它们进行转义。
系统目录属性
此构建的源码初始化值。字段含义参见 pg_type 。包含头文件默认值;依赖构建的常量保留符号形式,不作为服务器运行时实测。
oid17descrvariable-length string, binary values escapedtypacl_null_typlen-1typelem0typnamebyteatypsendbyteasendtyptypebtypalignityparray0typbyvalftypdelim','typinputbyteaintypmodin-typndims0typownerPOSTGREStyprelid0typmodout-typoutputbyteaouttyptypmod-1typanalyze-typdefault_null_typnotnullftypreceivebytearecvtypstoragextypbasetype0typcategoryUtypcollation0typisdefinedttypnamespacepg_catalogtypsubscript-typdefaultbin_null_array_type_oid1001typispreferredfarray_type_name_bytea
类型转换 9
与此类型相关的显式 pg_cast 记录。PostgreSQL 还支持 pg_cast 之外的类型转换,缺少记录不能证明转换不可能。
运算符重载 9
每种操作数签名均为独立重载。实现函数和返回类型来自同一源码构建。
操作符类 4
声明输入类型与此类型相符的操作符类。多态操作符类、类型转换和表达式索引还可能提供其他索引路径;不能仅凭此表判断是否支持索引。
版本比较
PostgreSQL 17.11 → 18.6。属性比较不包含构建标识和说明正文;原始目录字段与源描述保留原文。
类型转换
PostgreSQL 17.11
[{"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_dependencies", "casttarget": "bytea"}, {"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_mcv_list", "casttarget": "bytea"}, {"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_ndistinct", "casttarget": "bytea"}]PostgreSQL 18.6
[{"castcontext": "e", "castfunc": "bytea(int2)", "castmethod": "f", "castsource": "int2", "casttarget": "bytea"}, {"castcontext": "e", "castfunc": "bytea(int4)", "castmethod": "f", "castsource": "int4", "casttarget": "bytea"}, {"castcontext": "e", "castfunc": "bytea(int8)", "castmethod": "f", "castsource": "int8", "casttarget": "bytea"}, {"castcontext": "e", "castfunc": "int2(bytea)", "castmethod": "f", "castsource": "bytea", "casttarget": "int2"}, {"castcontext": "e", "castfunc": "int4(bytea)", "castmethod": "f", "castsource": "bytea", "casttarget": "int4"}, {"castcontext": "e", "castfunc": "int8(bytea)", "castmethod": "f", "castsource": "bytea", "casttarget": "int8"}, {"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_dependencies", "casttarget": "bytea"}, {"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_mcv_list", "casttarget": "bytea"}, {"castcontext": "i", "castfunc": "0", "castmethod": "b", "castsource": "pg_ndistinct", "casttarget": "bytea"}]这些构建的文档也有差异,请查看对应版本的手册定义。
文档与源码
- 构建
- 18.6 · https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
相关条目
全部数据类型 · 下载此版本 JSON · 最早收录的样本不代表该类型的实际引入版本。