pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述每条消息的详细格式。每条消息都标明它可以由前端(F)、后端(B)或双方(F & B)发送。注意,虽然每条消息开头都有字节计数,但消息格式的定义使得无需参考该计数也能确定消息的结束位置。这有助于检查消息的有效性。(CopyData 消息是例外,因为它构成数据流的一部分,任何单条 CopyData 消息的内容都无法独立解释。)
消息体是按服务器偏好顺序排列的 SASL 认证机制列表。在最后一个认证机制名称之后,必须有一个零字节作为终止符。每个机制包含以下内容:
SASL 认证机制的名称。
将该消息标识为 Bind 命令。
消息内容的长度(以字节为单位),包括其自身。
目标 portal 的名称(空字符串选择未命名的 portal)。
源预备语句的名称(空字符串选择未命名的预备语句)。
后续参数格式代码的数量(下文以 C 表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有参数;还可以等于实际参数数量。
C] #参数格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
后续参数值的数量(可以为零)。必须与查询所需的参数数量一致。
接下来,每个参数都有以下一对字段:
最后一个参数之后是以下字段:
将该消息标识为命令完成响应。
消息内容的长度(以字节为单位),包括其自身。
命令标签。通常是一个单词,用来标识已完成的 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 报告译文问题。英文原文本身的问题请通过上游文档表单反馈给 PostgreSQL 文档维护者。