# 53.7.

消息格式本节描述每条消息的详细格式。每个都被标记以表明它可以由前端 (F)、后端 (B) 或两者 (F & B) 发送。请注意,虽然每条消息的开头都包含一个字节数,但消息格式已定义为无需参考字节数即可找到消息的结尾。这有助于有效性检查。(CopyData 消息是一个例外,因为它是数据流的一部分;任何单独的 CopyData 消息的内容都不能单独解释。)

认证OK (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(0)

指定认证成功。

身份验证KerberosV5 (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(2)

指定需要 Kerberos V5 身份验证。

身份验证明文密码 (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(3)

指定需要明文密码。

AuthenticationMD5Password (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(12)

消息内容的长度(以字节为单位),包括自身。

Int32(5)

指定需要 MD5 加密的密码。

字节4

加密密码时使用的盐。

身份验证SCMCredential (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(6)

指定需要 SCM 凭据消息。

认证GSS (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(7)

指定需要 GSSAPI 身份验证。

认证GSS继续(B)

字节 1('R')

将消息标识为身份验证请求。

整数32

消息内容的长度(以字节为单位),包括自身。

Int32(8)

指定此消息包含 GSSAPI 或 SSPI 数据。

字节*n*

GSSAPI 或 SSPI 身份验证数据。

身份验证SSPI (B)

字节 1('R')

将消息标识为身份验证请求。

Int32(8)

消息内容的长度(以字节为单位),包括自身。

Int32(9)

指定需要 SSPI 身份验证。

身份验证SASL (B)

字节 1('R')

将消息标识为身份验证请求。

整数32

消息内容的长度(以字节为单位),包括自身。

Int32(10)

指定需要 SASL 身份验证。

消息正文是按服务器优先顺序排列的 SASL 身份验证机制列表。最后一个身份验证机制名称之后需要一个零字节作为终止符。对于每种机制,有以下几点:

细绳

SASL 认证机制的名称。

身份验证SASLContinue (B)

字节 1('R')

将消息标识为身份验证请求。

整数32

消息内容的长度(以字节为单位),包括自身。

诠释32(11)

指定此消息包含 SASL 质询。

字节*n*

SASL 数据,特定于所使用的 SASL 机制。

身份验证SASLFfinal (B)

字节 1('R')

将消息标识为身份验证请求。

整数32

消息内容的长度(以字节为单位),包括自身。

Int32(12)

指定 SASL 身份验证已完成。

字节*n*

SASL 结果“附加数据”,特定于所使用的 SASL 机制。

后端密钥数据 (B)

字节 1('K')

将消息标识为取消键数据。如果前端希望以后能够发出 CancelRequest 消息,它必须保存这些值。

Int32(12)

消息内容的长度(以字节为单位),包括自身。

整数32

此后端的进程 ID。

整数32

此后端的密钥。

绑定 (F)

字节 1('B')

将消息标识为绑定命令。

整数32

消息内容的长度(以字节为单位),包括自身。

细绳

目标门户的名称(空字符串选择未命名的门户)。

细绳

源预准备语句的名称(空字符串选择未命名的预准备语句)。

16

后面的参数格式代码的数量(表示为*C*以下)。这可以为零表示没有参数或参数都使用默认格式(文本);或者一个,在这种情况下,指定的格式代码应用于所有参数;或者它可以等于参数的实际数量。

16[C]

参数格式代码。每个当前必须为零(文本)或一(二进制)。

16

后面的参数值的数量(可能为零)。这必须与查询所需的参数数量相匹配。

接下来,为每个参数显示以下字段对:

整数32

参数值的长度,以字节为单位(此计数不包括自身)。可以为零。作为一种特殊情况,-1 表示 NULL 参数值。在 NULL 情况下没有值字节跟随。

字节*n*

参数的值,采用相关格式代码指示的格式。*n*是上面的长度。

在最后一个参数之后,会出现以下字段:

16

随后的结果列格式代码的数量(表示为*R*以下)。这可以为零表示没有结果列或结果列都应使用默认格式(文本);或者一个,在这种情况下,指定的格式代码应用于所有结果列(如果有);或者它可以等于查询的实际结果列数。

16[R]

结果列格式代码。每个当前必须为零(文本)或一(二进制)。

绑定完成 (B)

字节 1('2')

将消息标识为绑定完成指示符。

Int32(4)

消息内容的长度(以字节为单位),包括自身。

取消请求 (F)

Int32(16)

消息内容的长度(以字节为单位),包括自身。

Int32(80877102)

取消请求代码。选择要包含的值1234在最高有效16位中,以及5678在最低有效16位。(为避免混淆,此代码不得与任何协议版本号相同。)

Int32

目标后端的进程ID。

Int32

目标后端的密钥。

关闭(F)

字节1('C')

将消息标识为关闭命令。

Int32

消息内容的长度(字节),包括self。

字节1

'S“结束一份事先准备好的声明;或者P“关闭门户。

一串

要关闭的准备语句或门户的名称(空字符串选择未命名的准备语句或门户)。

完成(B)

字节1('3')

将消息标识为关闭完成指示器。

Int32(4)

消息内容的长度(字节),包括self。

命令完成(B)

字节1('C')

将消息标识为命令完成的响应。

Int32

消息内容的长度(字节),包括self。

一串

命令标签。这通常是一个单词,用于标识完成了哪个SQL命令。

为了一个插入命令,标签是插入*老年人* **哪里*是插入的行数。老年人用于插入行的对象ID,如果was 1,目标表有OID,但不再支持OID系统列;因此老年人*总是0.

暂时删去命令,标签是删除**哪里**是删除的行数。

为了一个使现代化命令,标签是更新**哪里**是更新的行数。

暂时选择将表创建为命令,标签是挑选**哪里**是检索到的行数。

暂时移动命令,标签是移动**哪里**光标位置已更改的行数。

暂时取来命令,标签是取回**哪里**是从光标检索到的行数。

暂时复制命令,标签是抄袭**哪里**是复制的行数。(注意:行计数仅在PostgreSQL 8.2及更高版本中出现。)

CopyData(餐饮部)

字节1('d')

将消息标识为复制数据

Int32

消息内容的长度(字节),包括self。

字节*n*

构成数据的一部分的数据复制数据流。从后端发送的消息将始终对应于单个数据行,但前端发送的消息可能会任意分割数据流。

复制(餐饮)

字节1('c')

将消息标识为复制-完成指示器。

Int32(4)

消息内容的长度(字节),包括self。

复制失败(F)

字节1('f')

将消息标识为复制-故障指示器。

Int32

消息内容的长度(字节),包括self。

一串

要报告为故障原因的错误消息。

复印回复(B)

字节1('G')

将消息标识为响应的开始副本。前端现在必须发送copy in数据(如果不准备发送,则发送CopyFail消息)。

Int32

消息内容的长度(字节),包括self。

Int8

0表示总体复制格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1表示总体拷贝格式为二进制(类似于DataRow格式)。看见复制了解更多信息。

Int16

要复制的数据中的列数(表示为*N*下面)。

Int16[N]

用于每列的格式代码。每一个当前必须为零(文本)或一(二进制)。如果整个副本格式为文本格式,则All必须为零。

CopyOutResponse(B)

字节1('H')

将消息标识为开始复制响应。此消息后面将是复制数据。

Int32

消息内容的长度(字节),包括self。

Int8

0表示总体复制格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1表示总体拷贝格式为二进制(类似于DataRow格式)。看见复制了解更多信息。

Int16

要复制的数据中的列数(表示为*N*下面)。

Int16[N]

用于每列的格式代码。每一个当前必须为零(文本)或一(二进制)。如果整个副本格式为文本格式,则All必须为零。

抄袭响应(B)

字节1('W')

将消息标识为“开始复制”响应。此消息仅用于流式复制。

Int32

消息内容的长度(字节),包括self。

Int8

0表示总体复制格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1表示总体拷贝格式为二进制(类似于DataRow格式)。看见复制了解更多信息。

Int16

要复制的数据中的列数(表示为*N*下面)。

Int16[N]

用于每列的格式代码。每一个当前必须为零(文本)或一(二进制)。如果整个副本格式为文本格式,则All必须为零。

数据行(B)

字节1('D')

将消息标识为数据行。

Int32

消息内容的长度(字节),包括self。

Int16

后面的列值数(可能为零)。

接下来,将为每列显示以下字段对:

Int32

列值的长度,以字节为单位(此计数不包括自身)。可以是零。作为特例,-1表示空列值。空值情况下没有值字节。

字节*n*

列的值,格式由关联的格式代码指示。*n*是上面的长度。

描述(F)

字节1('D')

将消息标识为描述命令。

Int32

消息内容的长度(字节),包括self。

字节1

'S“描述一份事先准备好的声明;或者P“来描述一个门户。

一串

要描述的已准备语句或门户的名称(空字符串选择未命名的已准备语句或门户)。

EmptyQueryResponse(B)

字节1(‘I’)

将消息标识为对空查询字符串的响应。(这取代了CommandComplete。)

Int32(4)

消息内容的长度(字节),包括self。

错误响应(B)

字节1('E')

将消息标识为错误。

Int32

消息内容的长度(字节),包括self。

消息正文由一个或多个标识字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。每个字段都有以下内容:

字节1

识别字段类型的代码;如果为零,这是消息终止符,后面没有字符串。中列出了当前定义的字段类型第53.8节.由于将来可能会添加更多字段类型,前端应该默默地忽略无法识别类型的字段。

一串

字段值。

执行(F)

字节1('E')

将消息标识为执行命令。

Int32

消息内容的长度(字节),包括self。

一串

要执行的门户的名称(空字符串选择未命名的门户)。

Int32

如果门户包含返回行的查询,则返回的最大行数(否则忽略)。零表示“没有限制”。

冲洗(F)

字节1('H')

将消息标识为刷新命令。

Int32(4)

消息内容的长度(字节),包括self。

函数调用(F)

字节1('F')

将消息标识为函数调用。

Int32

消息内容的长度(字节),包括self。

Int32

指定要调用的函数的对象ID。

Int16

后面的参数格式代码数(表示为*C*下面)。这可以是零,表示没有参数,或者参数都使用默认格式(文本);或者一个,在这种情况下,指定的格式代码应用于所有参数;或者它可以等于实际的参数数量。

Int16[C]

参数格式代码。每一个当前必须为零(文本)或一(二进制)。

Int16

指定提供给函数的参数数。

接下来,将为每个参数显示以下字段对:

Int32

参数值的长度,以字节为单位(此计数不包括自身)。可以是零。作为特例,-1表示一个空参数值。空值情况下没有值字节。

字节*n*

参数的值,格式由关联的格式代码指示。*n*是上面的长度。

在最后一个参数之后,将显示以下字段:

Int16

函数结果的格式代码。当前必须为零(文本)或一(二进制)。

函数调用响应(B)

字节1('V')

将消息标识为函数调用结果。

Int32

消息内容的长度(字节),包括self。

Int32

函数结果值的长度,以字节为单位(此计数不包括其本身)。可以是零。作为特例,-1表示空函数结果。空值情况下没有值字节。

字节*n*

函数结果的值,采用相关格式代码指示的格式。*n*是上面的长度。

GSSENCRequest(F)

Int32(8)

消息内容的长度(字节),包括self。

Int32(80877104)

GSSAPI加密请求代码。选择要包含的值1234在最高有效16位中,以及5680在最低有效16位。(为避免混淆,此代码不得与任何协议版本号相同。)

GSS响应(F)

字节1('p')

将消息标识为GSSAPI或SSPI响应。请注意,这也用于SASL和密码响应消息。确切的消息类型可以从上下文中推断出来。

Int32

消息内容的长度(字节),包括self。

字节*n*

GSSAPI/SSPI特定的消息数据。

谈判协议(B)

字节1('v')

将消息标识为协议版本协商消息。

Int32

消息内容的长度(字节),包括self。

Int32

对于客户端请求的主要协议版本,服务器支持的最新次要协议版本。

Int32

服务器无法识别的协议选项数。

然后,对于服务器无法识别的协议选项,有以下内容:

一串

选项名称。

野田(B)

字节1('n')

将消息标识为无数据指示器。

Int32(4)

消息内容的长度(字节),包括self。

通知响应(B)

字节1('N')

将消息标识为通知。

Int32

消息内容的长度(字节),包括self。

消息正文由一个或多个标识字段组成,后跟一个零字节作为终止符。字段可以以任何顺序出现。每个字段都有以下内容:

字节1

识别字段类型的代码;如果为零,这是消息终止符,后面没有字符串。中列出了当前定义的字段类型第53.8节.由于将来可能会添加更多字段类型,前端应该默默地忽略无法识别类型的字段。

一串

字段值。

通知回复(B)

字节1('A')

将消息标识为通知响应。

Int32

消息内容的长度(字节),包括self。

Int32

通知后端进程的进程ID。

一串

引发通知的频道的名称。

一串

从通知进程传递的“有效负载”字符串。

参数说明(B)

字节1('t')

将消息标识为参数说明。

Int32

消息内容的长度(字节),包括self。

Int16

语句使用的参数数(可以为零)。

然后,对于每个参数,有以下内容:

Int32

指定参数数据类型的对象ID。

参数状态(B)

字节1('S')

将消息标识为运行时参数状态报告。

Int32

消息内容的长度(字节),包括self。

一串

正在报告的运行时参数的名称。

一串

参数的当前值。

解析(F)

字节1('P')

将消息标识为解析命令。

Int32

消息内容的长度(字节),包括self。

一串

目标准备语句的名称(空字符串选择未命名的准备语句)。

一串

要分析的查询字符串。

Int16

指定的参数数据类型数(可以为零)。请注意,这并不是表示查询字符串中可能出现的参数数量,而是前端希望预先指定类型的数量。

然后,对于每个参数,有以下内容:

Int32

指定参数数据类型的对象ID。在这里输入零相当于不指定类型。

完成(B)

字节1('1')

将消息标识为解析完成指示符。

Int32(4)

消息内容的长度(字节),包括self。

密码信息(F)

字节1('p')

将消息标识为密码响应。注意,这也用于GSSAPI、SSPI和SASL响应消息。确切的消息类型可以从上下文中推断出来。

Int32

消息内容的长度(字节),包括self。

一串

密码(如果需要,请加密)。

门式悬挂(B)

字节1('s')

将消息标识为门户挂起指示器。注意:只有在达到执行消息的行数限制时,才会出现此选项。

Int32(4)

消息内容的长度(字节),包括self。

查询(F)

字节1('Q')

将消息标识为简单查询。

Int32

消息内容的长度(字节),包括self。

一串

查询字符串本身。

ReadyForQuery(B)

字节1('Z')

标识消息类型。每当后端为新的查询周期做好准备时,就会发送ReadyForQuery。

Int32(5)

消息内容的长度(字节),包括self。

字节1

当前后端事务状态指示器。可能的值是''如果空闲(不在事务块中);'T“如果在交易区块中;或者E'如果在失败的事务块中(查询将被拒绝,直到块结束)。

描述(B)

字节1('T')

将消息标识为行描述。

Int32

消息内容的长度(字节),包括self。

Int16

指定行中的字段数(可以为零)。

然后,对于每个字段,都有以下内容:

一串

字段名。

Int32

如果该字段可以标识为特定表的列,则该表的对象ID;否则为零。

Int16

如果该字段可以标识为特定表的一列,则该列的属性号;否则为零。

Int32

字段数据类型的对象ID。

Int16

数据类型大小(请参见pg_类型。泰普伦).请注意,负值表示可变宽度类型。

Int32

类型修饰符(请参见pg_属性。atttypmod).修饰语的含义是特定于类型的。

Int16

用于字段的格式代码。当前将为零(文本)或一(二进制)。在从descripe的语句变量返回的RowDescription中,格式代码未知,并且始终为零。

临床反应(F)

字节1('p')

将消息标识为初始SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。确切的消息类型是根据上下文推断的。

Int32

消息内容的长度(字节),包括self。

一串

客户端选择的SASL身份验证机制的名称。

Int32

SASL机制特定的“初始客户端响应”的长度,如果没有初始响应,则为-1.

字节*n*

SASL机制特定的“初始响应”。

SASLResponse(F)

字节1('p')

将消息标识为SASL响应。请注意,这也用于GSSAPI、SSPI和密码响应消息。确切的消息类型可以从上下文中推断出来。

Int32

消息内容的长度(字节),包括self。

字节*n*

SASL机制特定的消息数据。

SSLRequest(F)

Int32(8)

消息内容的长度(字节),包括self。

Int32(80877103)

SSL请求代码。选择要包含的值1234在最高有效16位中,以及5679在最低有效16位。(为避免混淆,此代码不得与任何协议版本号相同。)

StartupMessage(F)

Int32

消息内容的长度(字节),包括self。

Int32(196608)

协议版本号。最重要的16位是主版本号(此处描述的协议为3)。最低有效16位是次要版本号(此处描述的协议为0)。

协议版本号后面是一对或多对参数名称和值字符串。姓氏/值对后需要一个零字节作为终止符。参数可以以任何顺序出现。使用者是必需的,其他是可选的。每个参数指定为:

一串

参数名。目前公认的名字有:

使用者

要连接的数据库用户名。必修的;没有违约。

数据库

要连接到的数据库。默认为用户名。

选项

后端的命令行参数。(不推荐使用此选项,而是支持设置单个运行时参数。)除非用反斜杠转义,否则此字符串中的空格被视为分隔参数(\); 写\\表示字面上的反斜杠。

复制

用于在流式复制模式下连接,在这种模式下,可以发出一小组复制命令,而不是SQL语句。价值可以是符合事实的, 错误的数据库,默认值为错误的看见第53.4节详细信息。

除上述参数外,还可能列出其他参数。参数名称以_pq_2;。保留用作协议扩展,而其他被视为在后端启动时设置的运行时参数。此类设置将在后端启动期间应用(在解析命令行参数(如果有)之后),并将作为会话默认值。

一串

参数值。

同步(F)

字节1('S')

将消息标识为同步命令。

Int32(4)

消息内容的长度(字节),包括self。

终止(F)

字节1('X')

将消息标识为终止。

Int32(4)

消息内容的长度(字节),包括self。