本节描述每条消息的详细格式。每条消息都标记了可由前端(F)、后端(B)或双方(F&B)发送。 请注意,虽然每条消息开头都带有字节计数,但大多数消息格式都定义为无需参考该计数也能确定消息边界。这一设计最初是出于历史原因(早期已废弃的协议 v2 没有显式长度字段),同时也有助于有效性校验。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定认证成功。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要 Kerberos V5 认证。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要明文密码。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要MD5加密的密码。
用于加密密码时使用的盐。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要 GSSAPI 认证。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定此消息包含GSSAPI或SSPI数据。
nGSSAPI 或 SSPI 认证数据。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要 SSPI 认证。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定需要 SASL 认证。
消息正文是服务器首选的 SASL 认证机制列表。在最后一个认证机制名称后需要一个零字节作为终止符。对于每个机制,有以下内容:
SASL 认证机制的名称。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定此消息包含一个SASL挑战。
nSASL数据,特定于正在使用的SASL机制。
标识消息为认证请求。
消息内容的长度(以字节为单位),包括其自身。
指定SASL认证已完成。
nSASL结果"附加数据",特定于正在使用的SASL机制。
标识消息为取消键数据。 如果前端希望能够稍后发出CancelRequest消息,必须保存这些值。
消息内容的长度(以字节为单位),包括其自身。
这个后端的进程ID。
该后端的 secret key。该字段长度由消息总长度决定,并一直延伸到消息末尾。
key 的最小与最大长度分别为 4 和 256 字节。PostgreSQL 服务器当前发送不超过 32 字节的 key;更大的上限用于兼容未来版本及连接池/中间件使用更长 key 的需求。中间件也不宜用满全部字节,以便多层中间件叠加时仍可附加自身数据。
在协议 3.2 之前,secret key 固定为 4 字节。
将消息标识为绑定命令。
消息内容的长度(以字节为单位),包括其自身。
目标 portal 的名称(空字符串选择未命名的 portal)。
源预备语句的名称(空字符串选择未命名的预备语句)。
后面跟着的参数格式代码的数量(以下标记为C)。 这可以是零,表示没有参数或者所有参数都使用默认格式(文本); 或者是一个,这种情况下指定的格式代码应用于所有参数; 或者等于实际参数的数量。
C]参数格式代码。每个目前必须是零(文本)或一(二进制)。
后面跟着的参数值的数量(可能为零)。 这个数量必须与查询所需的参数数量匹配。
接下来,对于每个参数,都会出现以下一对字段:
参数值的长度,以字节为单位(此计数不包括自身)。可以为零。 作为特殊情况,-1表示空参数值。 在空参数值的情况下,不会跟随任何值字节。
n参数的值,以相关格式代码指示的格式表示。 n是上述长度。
在最后一个参数之后,出现以下字段:
后跟的结果列格式代码数量(以下标记为R)。 这可以是零,表示没有结果列,或者所有结果列应该使用默认格式(文本); 或者是一个,此时指定的格式代码将应用于所有结果列(如果有); 或者等于查询的实际结果列数。
R]结果列格式代码。每个目前必须是零(文本)或一(二进制)。
标识消息为绑定完成指示器。
消息内容的长度(以字节为单位),包括其自身。
消息内容的长度(以字节为单位),包括其自身。
取消请求代码。该值被选择为在最高的16位中包含1234,在最低的16位中包含5678。 (为避免混淆,此代码不得与任何协议版本号相同。)
目标后端的进程ID。
目标后端的 secret key。该字段长度由消息总长度决定并延伸至消息末尾,最大长度为 256 字节。
在协议 3.2 之前,secret key 固定为 4 字节。
将消息标识为关闭命令。
消息内容的长度(以字节为单位),包括其自身。
'S' 表示关闭一个预备语句;或者 'P' 表示关闭一个 portal。
要关闭的预备语句或 portal 的名称(空字符串选择未命名的预备语句或 portal)。
标识消息为关闭完成指示符。
消息内容的长度(以字节为单位),包括其自身。
标识消息为命令完成响应。
消息内容的长度(以字节为单位),包括其自身。
命令标签。这通常是一个单词,用于标识已完成的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及更高版本中。)
标识消息为COPY数据。
消息内容的长度(以字节为单位),包括其自身。
n数据是COPY数据流的一部分。来自后端的消息始终对应单个数据行, 但来自前端的消息可能会任意划分数据流。
将消息标识为COPY完成指示符。
消息内容的长度(以字节为单位),包括其自身。
将消息标识为COPY失败指示器。
消息内容的长度(以字节为单位),包括其自身。
作为失败原因报告的错误消息。
标识消息为开始复制响应。 前端现在必须发送复制数据(如果没有准备好,发送CopyFail消息)。
消息内容的长度(以字节为单位),包括其自身。
0表示整体COPY格式是文本的(行由换行符分隔,列由分隔符分隔等)。 1表示整体复制格式是二进制的(类似于DataRow格式)。 更多信息请参见COPY。
要复制的数据中的列数(以下用N表示)。
N]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为开始复制输出响应。 该消息将被复制输出数据跟随。
消息内容的长度(以字节为单位),包括其自身。
0表示整体COPY格式为文本格式(行由换行符分隔,列由分隔符字符分隔等)。 1表示整体复制格式为二进制格式(类似于DataRow格式)。更多信息请参见COPY。
要复制的数据中的列数(以下用N表示)。
N]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为开始复制双响应。此消息仅用于流复制。
消息内容的长度(以字节为单位),包括其自身。
0表示整体COPY格式为文本格式(行由换行符分隔,列由分隔符字符分隔等)。 1表示整体复制格式为二进制格式(类似于DataRow格式)。更多信息请参见COPY。
要复制的数据中的列数(以下用N表示)。
N]每列要使用的格式代码。 每个必须目前为零(文本)或一(二进制)。 如果整体复制格式为文本,则所有必须为零。
标识消息为数据行。
消息内容的长度(以字节为单位),包括其自身。
后面跟着的列值的数量(可能为零)。
接下来,对于每一列,都会出现以下一对字段:
列值的长度,以字节为单位(此计数不包括其本身)。可以为零。 作为特殊情况,-1表示空列值。在空值情况下,不跟随任何值字节。
n列的值,格式由相关的格式代码指示。 n是上述长度。
标识消息为描述命令。
消息内容的长度(以字节为单位),包括其自身。
'S' 表示描述一个预备语句;或者 'P' 表示描述一个 portal。
要描述的预备语句或 portal 的名称(空字符串选择未命名的预备语句或 portal)。
将消息标识为对空查询字符串的响应。(这相当于CommandComplete。)
消息内容的长度(以字节为单位),包括其自身。
将消息标识为错误。
消息内容的长度(以字节为单位),包括其自身。
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在Section 53.8中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
标识消息为一个执行命令。
消息内容的长度(以字节为单位),包括其自身。
要执行的 portal 的名称(空字符串选择未命名的 portal)。
如果 portal 包含返回行的查询,则为要返回的最大行数(否则忽略)。零表示“没有限制”。
将消息标识为Flush命令。
消息内容的长度(以字节为单位),包括其自身。
标识消息为函数调用。
消息内容的长度(以字节为单位),包括其自身。
指定要调用的函数的对象ID。
后面跟着的参数格式代码的数量(以下标记为C)。 这可以是零,表示没有参数或所有参数都使用默认格式(文本); 或者是一个,这种情况下指定的格式代码应用于所有参数; 或者等于实际参数的数量。
C]参数格式代码。每个目前必须是零(文本)或一(二进制)。
指定传递给函数的参数数量。
接下来,对于每个参数,都会出现以下一对字段:
参数值的长度,以字节为单位(此计数不包括自身)。可以为零。 作为特殊情况,-1表示空参数值。 在空参数值的情况下,不会跟随任何值字节。
n参数的值,以相关格式代码指示的格式表示。 n是上述长度。
在最后一个参数之后,出现以下字段:
函数结果的格式代码。目前必须是零(文本)或一(二进制)。
标识消息为函数调用结果。
消息内容的长度(以字节为单位),包括其自身。
函数结果值的长度,以字节为单位(此计数不包括本身)。可以为零。 作为特殊情况,-1表示NULL函数结果。 在NULL情况下,不会跟随任何值字节。
n函数结果的值,格式由相关的格式代码指示。 n是上述长度。
消息内容的长度(以字节为单位),包括其自身。
GSSAPI加密请求代码。该值被选择为包含最高16位中的1234, 以及最低16位中的5680。(为避免混淆,此代码不得与任何协议版本号相同。)
识别消息为GSSAPI或SSPI响应。请注意,这也用于SASL和密码响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度(以字节为单位),包括其自身。
nGSSAPI/SSPI 特定的消息数据。
标识消息为协议版本协商消息。
消息内容的长度(以字节为单位),包括其自身。
服务器支持的最新次要协议版本,用于客户端请求的主要协议版本。
服务器未识别的协议选项数量。
然后,对于服务器未识别的协议选项,有以下内容:
选项名称。
将消息标识为无数据指示器。
消息内容的长度(以字节为单位),包括其自身。
将消息标识为通知。
消息内容的长度(以字节为单位),包括其自身。
消息正文由一个或多个已识别的字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容:
一个用于标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。 目前定义的字段类型列在Section 53.8中。 由于将来可能会添加更多的字段类型,前端应该静默地忽略未识别类型的字段。
字段数值。
标识消息为通知响应。
消息内容的长度(以字节为单位),包括其自身。
通知后端进程的进程ID。
通知被触发的频道名称。
从通知进程传递的“有效负载”字符串。
标识消息为参数描述。
消息内容的长度(以字节为单位),包括其自身。
语句使用的参数数量(可以为零)。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。
标识消息为运行时参数状态报告。
消息内容的长度(以字节为单位),包括其自身。
正在报告的运行时参数的名称。
参数的当前值。
将消息标识为解析命令。
消息内容的长度(以字节为单位),包括其自身。
目标预备语句的名称(空字符串选择未命名的预备语句)。
要解析的查询字符串。
指定的参数数据类型的数量(可以为零)。请注意,这不是查询字符串中可能出现的参数数量的指示, 而是前端希望为其预先指定类型的参数数量。
然后,对于每个参数,都有以下内容:
指定参数数据类型的对象ID。在这里放置零相当于未指定类型。
将消息标识为解析完成指示器。
消息内容的长度(以字节为单位),包括其自身。
标识消息为密码响应。请注意,这也用于GSSAPI、SSPI和SASL响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度(以字节为单位),包括其自身。
密码(如果需要,已加密)。
标识消息为 portal 挂起指示器。 请注意,仅当执行消息的行数限制达到时才会出现此消息。
消息内容的长度(以字节为单位),包括其自身。
标识消息为简单查询。
消息内容的长度(以字节为单位),包括其自身。
查询字符串本身。
标识消息类型。ReadyForQuery在后端准备好进行新的查询周期时发送。
消息内容的长度(以字节为单位),包括其自身。
当前后端事务状态指示器。 可能的值为'I',如果空闲(不在事务块中);'T',如果在事务块中; 或'E',如果在失败的事务块中(查询将被拒绝,直到块结束)。
标识消息为行描述。
消息内容的长度(以字节为单位),包括其自身。
指定一行中的字段数(可以为零)。
然后,对于每个字段,都有以下内容:
字段名称。
如果该字段可以被识别为特定表的列,则为该表的对象ID;否则为零。
如果该字段可以被识别为特定表的列,则为该列的属性编号;否则为零。
字段数据类型的对象ID。
数据类型大小(参见pg_type.typlen)。 注意,负值表示可变宽度类型。
类型修饰符(参见pg_attribute.atttypmod)。 修饰符的含义是特定于类型的。
正在使用的字段格式代码。目前将为零(文本)或一(二进制)。在从描述语句变体返回的RowDescription中,格式代码尚未知晓,将始终为零。
标识消息为初始SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。 精确的消息类型是从上下文中推断出来的。
消息内容的长度(以字节为单位),包括其自身。
客户端选择的SASL认证机制的名称。
长度为SASL机制特定的“初始客户端响应”,如果没有初始响应,则为-1。
nSASL机制特定的“初始响应”。
标识消息为SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。 可以从上下文中推断出确切的消息类型。
消息内容的长度(以字节为单位),包括其自身。
nSASL机制特定的消息数据。
消息内容的长度(以字节为单位),包括其自身。
SSL请求代码。该值被选择为在最高的16位中包含1234, 在最低的16位中包含5679。(为避免混淆,此代码 不得与任何协议版本号相同。)
消息内容的长度(以字节为单位),包括其自身。
协议版本号。最重要的16位是主版本号(此处描述的协议为3)。 最不重要的16位是次版本号(此处描述的协议为2)。
协议版本号后面跟着一个或多个参数名和值字符串对。在最后一个名/值对之后需要一个零字节作为终止符。 参数可以以任何顺序出现。user是必需的,其他是可选的。 每个参数的指定方式为:
参数名称。当前识别的名称包括:
user要连接的数据库用户名称。必填项;没有默认值。
database要连接的数据库。默认为用户名。
options后端的命令行参数。(已弃用,建议设置单独的运行时参数。)此字符串中的空格被视为分隔参数,除非用反斜杠(\)转义;写\\表示字面反斜杠。
replication用于以流式复制模式连接,可以发出一小组复制命令而不是SQL语句。值可以是true、false或database,默认为false。详细信息请参见Section 53.4。
除上述之外,还可以列出其他参数。以_pq_.开头的参数名称保留用于协议扩展,而其他参数被视为后端启动时设置的运行时参数。这些设置将在后端启动时应用(在解析命令行参数后,如果有的话),并将作为会话默认值。
参数数值。
将消息标识为同步命令。
消息内容的长度(以字节为单位),包括其自身。
标识消息为终止。
消息内容的长度(以字节为单位),包括其自身。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。