pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
消息体是按服务器偏好顺序排列的 SASL 认证机制列表。在最后一个认证机制名称之后,必须有一个零字节作为终止符。每个机制包含以下内容:
SASL 认证机制的名称。
将此消息标识为取消请求密钥数据。如果前端希望以后能够发送 CancelRequest 消息,就必须保存这些值。
消息内容的长度(以字节为单位),包括其自身。
此后端的进程 ID。
n #此后端的密钥。此字段延伸至消息末尾,其范围由长度字段确定。
密钥长度最小为 4 字节,最大为 256 字节。PostgreSQL 服务器只发送最长 32 字节的密钥,但更大的长度上限允许未来的服务器版本、连接池和其他中间件使用更长的密钥。一种可能的用途是在服务器密钥中附加额外信息。因此,也建议中间件不要用尽所有字节,以便多层中间件叠加时,每一层都可以在密钥外再附加数据。
在协议版本 3.2 之前,密钥始终为 4 字节长。
将该消息标识为 Bind 命令。
消息内容的长度(以字节为单位),包括其自身。
目标 portal 的名称(空字符串选择未命名的 portal)。
源预备语句的名称(空字符串选择未命名的预备语句)。
后续参数格式代码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有参数;还可以等于实际参数数量。
C] #参数格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
后续参数值的数量(可以为零)。必须与查询所需的参数数量一致。
接下来,每个参数都有以下一对字段:
最后一个参数之后是以下字段:
在协议版本 3.2 之前,密钥始终为 4 字节长。
将该消息标识为命令完成响应。
消息内容的长度(以字节为单位),包括其自身。
命令标签。通常是一个单词,用来标识已完成的 SQL 命令。
对于 INSERT 命令,标签是 INSERT ,其中 oid rowsrows 是插入的行数。如果 rows 为 1 且目标表具有 OIDs,则 oid 曾经是插入行的对象 ID,但不再支持 OIDs 系统列;因此 oid 总是 0。
对于 DELETE 命令,标签是 DELETE ,其中 rowsrows 表示删除的行数。
对于 UPDATE 命令,标签是 UPDATE ,其中 rowsrows 是更新的行数。
对于 MERGE 命令,标签是 MERGE ,其中 rowsrows 是插入、更新或删除的行数。
对于 SELECT 或 CREATE TABLE AS 命令,标签是 SELECT ,其中 rowsrows 是检索到的行数。
对于 MOVE 命令,标签是 MOVE ,其中 rowsrows 表示游标位置改变的行数。
对于 FETCH 命令,标签是 FETCH ,其中 rowsrows 是从游标中检索出的行数。
对于 COPY 命令,标签为 COPY ,其中 rowsrows 是复制的行数。(注意:行数仅出现在 PostgreSQL 8.2 及更高版本中。)
接下来,每列都有以下两个字段:
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
接下来,每个参数都有以下两个字段:
最后一个参数之后还有以下字段:
函数结果的格式代码。目前必须为零(文本)或一(二进制)。
接下来,对于服务器无法识别的每个协议选项,都有以下内容:
选项名称。
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
接下来,每个参数都有以下内容:
指定参数数据类型的对象 ID。
接下来,每个参数都有以下内容:
指定参数数据类型的对象 ID。此处填零等同于不指定类型。
接下来,每个字段都有以下内容:
字段名称。
如果能够确定该字段是某个特定表的列,则为该表的对象 ID;否则为零。
如果能够确定该字段是某个特定表的列,则为该列的属性编号;否则为零。
字段数据类型的对象 ID。
数据类型大小(参见 pg_type.typlen)。注意,负值表示可变宽度类型。
类型修饰符(参见 pg_attribute.atttypmod)。修饰符的含义是特定于类型的。
字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 针对预备语句的变体所返回的 RowDescription,格式代码尚未确定,始终为零。
协议版本号之后是一个或多个参数名与参数值字符串对。最后一个名称/值对之后必须有一个零字节作为终止符。参数可以按任意顺序出现。其中,user 是必需的,其余均为可选。每个参数按以下方式指定:
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游会在正式发布前持续修订。