54.7. 消息格式 #
本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
- AuthenticationOk (B) #
- AuthenticationKerberosV5 (B) #
- AuthenticationCleartextPassword (B) #
- AuthenticationMD5Password (B) #
- AuthenticationGSS (B) #
- AuthenticationGSSContinue (B) #
- AuthenticationSSPI (B) #
- AuthenticationSASL (B) #
消息体是按服务器偏好顺序排列的 SASL 认证机制列表。在最后一个认证机制名称之后,必须有一个零字节作为终止符。每个机制包含以下内容:
- String #
SASL 认证机制的名称。
- AuthenticationSASLContinue (B) #
- AuthenticationSASLFinal (B) #
- BackendKeyData (B) #
- Byte1('K') #
将此消息标识为取消请求密钥数据。如果前端希望以后能够发送 CancelRequest 消息,就必须保存这些值。
- Int32 #
消息内容的长度(以字节为单位),包括其自身。
- Int32 #
此后端的进程 ID。
- Byte
n# 此后端的密钥。此字段延伸至消息末尾,其范围由长度字段确定。
密钥长度最小为 4 字节,最大为 256 字节。PostgreSQL 服务器只发送最长 32 字节的密钥,但更大的长度上限允许未来的服务器版本、连接池和其他中间件使用更长的密钥。一种可能的用途是在服务器密钥中附加额外信息。因此,也建议中间件不要用尽所有字节,以便多层中间件叠加时,每一层都可以在密钥外再附加数据。
在协议版本 3.2 之前,密钥始终为 4 字节长。
- Bind (F) #
- Byte1('B') #
将该消息标识为 Bind 命令。
- Int32 #
消息内容的长度(以字节为单位),包括其自身。
- String #
目标 portal 的名称(空字符串选择未命名的 portal)。
- String #
源预备语句的名称(空字符串选择未命名的预备语句)。
- Int16 #
后续参数格式代码的数量(下文以
C表示)。可以为零,表示没有参数,或者所有参数都使用默认格式(文本);也可以为一,此时指定的格式代码应用于所有参数;还可以等于实际参数数量。- Int16[
C] # 参数格式代码。目前每个格式代码必须为零(文本)或一(二进制)。
- Int16 #
后续参数值的数量(可以为零)。必须与查询所需的参数数量一致。
接下来,每个参数都有以下一对字段:
最后一个参数之后是以下字段:
- BindComplete (B) #
- CancelRequest (F) #
在协议版本 3.2 之前,密钥始终为 4 字节长。
- Close (F) #
- CloseComplete (B) #
- CommandComplete (B) #
- Byte1('C') #
将该消息标识为命令完成响应。
- Int32 #
消息内容的长度(以字节为单位),包括其自身。
- String #
命令标签。通常是一个单词,用来标识已完成的 SQL 命令。
对于
INSERT命令,标签是INSERT,其中oidrowsrows是插入的行数。如果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 及更高版本中。)
- CopyData (F & B) #
- CopyDone (F & B) #
- CopyFail (F) #
- CopyInResponse (B) #
- CopyOutResponse (B) #
- CopyBothResponse (B) #
- DataRow (B) #
接下来,每列都有以下两个字段:
- Describe (F) #
- EmptyQueryResponse (B) #
- ErrorResponse (B) #
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
- Execute (F) #
- Flush (F) #
- FunctionCall (F) #
接下来,每个参数都有以下两个字段:
最后一个参数之后还有以下字段:
- Int16 #
函数结果的格式代码。目前必须为零(文本)或一(二进制)。
- FunctionCallResponse (B) #
- GSSENCRequest (F) #
- GSSResponse (F) #
- NegotiateProtocolVersion (B) #
接下来,对于服务器无法识别的每个协议选项,都有以下内容:
- String #
选项名称。
- NoData (B) #
- NoticeResponse (B) #
消息体由一个或多个带标识的字段组成,最后以一个零字节终止。字段可以按任意顺序出现。每个字段包含以下内容:
- NotificationResponse (B) #
- ParameterDescription (B) #
接下来,每个参数都有以下内容:
- Int32 #
指定参数数据类型的对象 ID。
- ParameterStatus (B) #
- Parse (F) #
接下来,每个参数都有以下内容:
- Int32 #
指定参数数据类型的对象 ID。此处填零等同于不指定类型。
- ParseComplete (B) #
- PasswordMessage (F) #
- PortalSuspended (B) #
- Query (F) #
- ReadyForQuery (B) #
- RowDescription (B) #
接下来,每个字段都有以下内容:
- String #
字段名称。
- Int32 #
如果能够确定该字段是某个特定表的列,则为该表的对象 ID;否则为零。
- Int16 #
如果能够确定该字段是某个特定表的列,则为该列的属性编号;否则为零。
- Int32 #
字段数据类型的对象 ID。
- Int16 #
数据类型大小(参见
pg_type.typlen)。注意,负值表示可变宽度类型。- Int32 #
类型修饰符(参见
pg_attribute.atttypmod)。修饰符的含义是特定于类型的。- Int16 #
字段所使用的格式代码。目前为零(文本)或一(二进制)。对于 Describe 针对预备语句的变体所返回的 RowDescription,格式代码尚未确定,始终为零。
- SASLInitialResponse (F) #
- SASLResponse (F) #
- SSLRequest (F) #
- StartupMessage (F) #
协议版本号之后是一个或多个参数名与参数值字符串对。最后一个名称/值对之后必须有一个零字节作为终止符。参数可以按任意顺序出现。其中,
user是必需的,其余均为可选。每个参数按以下方式指定:- Sync (F) #
- Terminate (F) #
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.