本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。 请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
消息正文是服务器首选的 SASL 认证机制列表。在最后一个认证机制名称后需要一个零字节作为终止符。对于每个机制,有以下内容:
SASL 认证机制的名称。
在协议 3.2 之前,secret key 固定为 4 字节。
将消息标识为绑定命令。
消息内容的长度(以字节为单位),包括其自身。
目标 portal 的名称(空字符串选择未命名的 portal)。
源预备语句的名称(空字符串选择未命名的预备语句)。
后面跟着的参数格式代码的数量(以下标记为C)。 这可以是零,表示没有参数或者所有参数都使用默认格式(文本); 或者是一个,这种情况下指定的格式代码应用于所有参数; 或者等于实际参数的数量。
C] #参数格式代码。每个目前必须是零(文本)或一(二进制)。
后面跟着的参数值的数量(可能为零)。 这个数量必须与查询所需的参数数量匹配。
接下来,对于每个参数,都会出现以下一对字段:
在最后一个参数之后,出现以下字段:
在协议 3.2 之前,secret key 固定为 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及更高版本中。)
接下来,对于每一列,都会出现以下一对字段:
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在Section 53.8中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
接下来,对于每个参数,都会出现以下一对字段:
在最后一个参数之后,出现以下字段:
函数结果的格式代码。目前必须是零(文本)或一(二进制)。
然后,对于服务器未识别的协议选项,有以下内容:
选项名称。
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在Section 53.8中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。在这里放置零相当于未指定类型。
然后,对于每个字段,都有以下内容:
字段名称。
如果该字段可以被识别为特定表的列,则为该表的对象ID;否则为零。
如果该字段可以被识别为特定表的列,则为该列的属性编号;否则为零。
字段数据类型的对象ID。
数据类型大小(参见pg_type.typlen)。 注意,负值表示可变宽度类型。
类型修饰符(参见pg_attribute.atttypmod)。 修饰符的含义是特定于类型的。
正在使用的字段格式代码。目前将为零(文本)或一(二进制)。在从描述语句变体返回的RowDescription中,格式代码尚未知晓,将始终为零。
协议版本号后面跟着一个或多个参数名和值字符串对。在最后一个名/值对之后需要一个零字节作为终止符。 参数可以以任何顺序出现。user是必需的,其他是可选的。 每个参数的指定方式为:
参数名称。当前识别的名称包括:
user #要连接的数据库用户名称。必填项;没有默认值。
database #要连接的数据库。默认为用户名。
options #后端的命令行参数。(已弃用,建议设置单独的运行时参数。)此字符串中的空格被视为分隔参数,除非用反斜杠(\)转义;写\\表示字面反斜杠。
replication #用于以流式复制模式连接,可以发出一小组复制命令而不是SQL语句。值可以是true、false或database,默认为false。详细信息请参见Section 53.4。
除上述之外,还可以列出其他参数。以_pq_.开头的参数名称保留用于协议扩展,而其他参数被视为后端启动时设置的运行时参数。这些设置将在后端启动时应用(在解析命令行参数后,如果有的话),并将作为会话默认值。
参数数值。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。