2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

53.7. 消息格式 #

本节介绍每条消息的详细格式。每个格式都标明了它可以由前端 (F)、后端 (B) 或两者 (F & B) 发送。请注意,尽管每条消息在开头都包含字节计数,但消息格式的定义使得可以在不参考字节计数的情况下找到消息结尾。这有助于验证。(CopyData 消息是一个例外,因为它构成数据流的一部分;任何单个 CopyData 消息的内容本身是不可解释的。)

AuthenticationOk (B) #
字节 1('R')

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

Int32(8)

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

Int32(0)

指定身份验证成功。

AuthenticationKerberosV5 (B) #
字节 1('R')

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

Int32(8)

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

Int32(2)

指定需要 Kerberos V5 身份验证。

AuthenticationCleartextPassword (B) #
字节 1('R')

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

Int32(8)

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

Int32(3)

指定需要明文密码。

AuthenticationMD5Password (B) #
字节 1('R')

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

Int32(12)

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

Int32(5)

指定需要 MD5 加密的密码。

Byte4

用于加密密码的盐。

AuthenticationGSS (B) #
字节 1('R')

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

Int32(8)

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

Int32(7)

指定需要 GSSAPI 身份验证。

AuthenticationGSSContinue (B) #
字节 1('R')

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

Int32

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

Int32(8)

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

Byten

GSSAPI 或 SSPI 身份验证数据。

AuthenticationSSPI (B) #
字节 1('R')

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

Int32(8)

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

Int32(9)

指定需要 SSPI 身份验证。

AuthenticationSASL (B) #
字节 1('R')

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

Int32

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

Int32(10)

指定需要 SASL 身份验证。

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

String

SASL 身份验证机制的名称。

AuthenticationSASLContinue (B) #
字节 1('R')

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

Int32

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

Int32(11)

指定此消息包含 SASL 质询。

Byten

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

AuthenticationSASLFinal (B) #
字节 1('R')

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

Int32

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

Int32(12)

指定 SASL 身份验证已完成。

Byten

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

BackendKeyData (B) #
字节 1('K')

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

Int32(12)

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

Int32

此后端的进程 ID。

Int32

此后端的密钥。

Bind (F) #
字节 1('B')

将消息标识为 Bind 命令。

Int32

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

String

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

String

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

Int16

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

Int16[C]

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

Int16

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

接下来,每个参数都会出现以下两对字段

Int32

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

Byten

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

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

Int16

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

Int16[R]

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

BindComplete (B) #
字节 1('2')

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

Int32(4)

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

CancelRequest (F) #
Int32(16)

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

Int32(80877102)

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

Int32

目标后端的进程 ID。

Int32

目标后端的密钥。

Close (F) #
字节 1('C')

将消息标识为 Close 命令。

Int32

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

字节 1

'S' 用于关闭准备语句;或 'P' 用于关闭门户。

String

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

CloseComplete (B) #
字节 1('3')

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

Int32(4)

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

CommandComplete (B) #
字节 1('C')

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

Int32

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

String

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

对于 INSERT 命令,标签为 INSERT oid rows,其中 rows 是插入的行数。 oid 以前是插入行的对象 ID(如果 rows 为 1 且目标表具有 OID),但 OID 系统列不再支持;因此,oid 始终为 0。

对于 DELETE 命令,标签为 DELETE rows,其中 rows 是删除的行数。

对于 UPDATE 命令,标签为 UPDATE rows,其中 rows 是更新的行数。

对于 MERGE 命令,标签为 MERGE rows,其中 rows 是插入、更新或删除的行数。

对于 SELECTCREATE TABLE AS 命令,标签为 SELECT rows,其中 rows 是检索的行数。

对于 MOVE 命令,标签为 MOVE rows,其中 rows 是游标位置已更改的行数。

对于 FETCH 命令,标签为 FETCH rows,其中 rows 是从游标中检索的行数。

对于 COPY 命令,标签为 COPY rows,其中 rows 是复制的行数。(注意:行数仅在 PostgreSQL 8.2 及更高版本中出现。)

CopyData (F & B) #
字节1('d')

标识消息为 COPY 数据。

Int32

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

Byten

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

CopyDone (F & B) #
字节1('c')

标识消息为 COPY 完成指示器。

Int32(4)

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

CopyFail (F) #
字节1('f')

标识消息为 COPY 失败指示器。

Int32

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

String

一条错误消息,报告为失败的原因。

CopyInResponse (B) #
字节1('G')

标识消息为开始复制输入响应。前端现在必须发送复制输入数据(如果尚未准备好这样做,则发送 CopyFail 消息)。

Int32

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

Int8

0 表示整体 COPY 格式为文本(行以换行符分隔,列以分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参见 COPY

Int16

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

Int16[N]

要用于每列的格式代码。目前每个代码必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有代码都必须为零。

CopyOutResponse (B) #
字节1('H')

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

Int32

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

Int8

0 表示整体 COPY 格式为文本(行以换行符分隔,列以分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参见 COPY

Int16

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

Int16[N]

要用于每列的格式代码。目前每个代码必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有代码都必须为零。

CopyBothResponse (B) #
字节1('W')

标识消息为开始复制双方响应。此消息仅用于流式复制。

Int32

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

Int8

0 表示整体 COPY 格式为文本(行以换行符分隔,列以分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参见 COPY

Int16

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

Int16[N]

要用于每列的格式代码。目前每个代码必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有代码都必须为零。

DataRow (B) #
字节1('D')

标识消息为数据行。

Int32

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

Int16

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

接下来,以下一对字段将针对每列出现

Int32

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

Byten

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

Describe (F) #
字节1('D')

标识消息为描述命令。

Int32

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

字节 1

'S' 表示描述预备语句;或 'P' 表示描述门户。

String

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

EmptyQueryResponse (B) #
字节1('I')

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

Int32(4)

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

ErrorResponse (B) #
字节1('E')

标识消息为错误。

Int32

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

消息主体包含一个或多个标识的字段,后面跟着一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容

字节 1

一个标识字段类型的代码;如果为零,则这是消息终止符,并且没有字符串跟随。当前定义的字段类型在 第 53.8 节 中列出。由于将来可能会添加更多字段类型,因此前端应静默忽略类型无法识别的字段。

String

字段值。

Execute (F) #
字节1('E')

标识消息为执行命令。

Int32

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

String

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

Int32

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

Flush (F) #
字节1('H')

标识消息为刷新命令。

Int32(4)

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

FunctionCall (F) #
字节1('F')

标识消息为函数调用。

Int32

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

Int32

指定要调用的函数的 ObjectID。

Int16

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

Int16[C]

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

Int16

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

接下来,以下一对字段将针对每个参数出现

Int32

参数值的长度,以字节为单位(此计数不包括自身)。可以为零。作为特例,-1 表示 NULL 参数值。在 NULL 情况下,不会有后续的值字节。

Byten

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

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

Int16

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

FunctionCallResponse (B) #
字节1('V')

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

Int32

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

Int32

函数结果值的长度,以字节为单位(此计数不包括自身)。可以为零。作为特例,-1 表示 NULL 函数结果。在 NULL 情况下,不会有后续的值字节。

Byten

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

GSSENCRequest (F) #
Int32(8)

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

Int32(80877104)

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

GSSResponse (F) #
字节1('p')

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

Int32

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

Byten

GSSAPI/SSPI 特定消息数据。

NegotiateProtocolVersion (B) #
字节1('v')

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

Int32

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

Int32

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

Int32

服务器未识别的协议选项数量。

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

String

选项名称。

NoData (B) #
字节1('n')

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

Int32(4)

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

NoticeResponse (B) #
字节1('N')

标识消息为通知。

Int32

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

消息主体包含一个或多个标识的字段,后面跟着一个零字节作为终止符。字段可以以任何顺序出现。对于每个字段,都有以下内容

字节 1

一个标识字段类型的代码;如果为零,则这是消息终止符,并且没有字符串跟随。当前定义的字段类型在 第 53.8 节 中列出。由于将来可能会添加更多字段类型,因此前端应静默忽略类型无法识别的字段。

String

字段值。

NotificationResponse (B) #
字节1('A')

标识消息为通知响应。

Int32

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

Int32

发出通知的后端进程的进程 ID。

String

已发出通知的通道的名称。

String

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

ParameterDescription (B) #
字节1('t')

标识消息为参数描述。

Int32

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

Int16

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

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

Int32

指定参数数据类型的 ObjectID。

ParameterStatus (B) #
字节1('S')

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

Int32

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

String

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

String

参数的当前值。

Parse (F) #
字节1('P')

标识消息为解析命令。

Int32

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

String

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

String

要解析的查询字符串。

Int16

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

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

Int32

指定参数数据类型的 ObjectID。在此处放置零等效于不指定类型。

ParseComplete (B) #
字节1('1')

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

Int32(4)

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

PasswordMessage (F) #
字节1('p')

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

Int32

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

String

密码(如果请求,则加密)。

PortalSuspended (B) #
字节1('s')

标识消息为门户挂起指示器。请注意,这仅在执行消息的行计数限制达到时出现。

Int32(4)

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

Query (F) #
字节1('Q')

标识消息为简单查询。

Int32

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

String

查询字符串本身。

ReadyForQuery (B) #
字节1('Z')

标识消息类型。ReadyForQuery 在后端准备好新查询周期时发送。

Int32(5)

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

字节 1

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

RowDescription (B) #
字节1('T')

标识消息为行描述。

Int32

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

Int16

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

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

String

字段名称。

Int32

如果字段可以识别为特定表的列,则为表的 ObjectID;否则为零。

Int16

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

Int32

字段的数据类型的 ObjectID。

Int16

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

Int32

类型修饰符(参见 pg_attribute.atttypmod)。修饰符的含义是特定于类型的。

Int16

用于该字段的格式代码。当前将为零(文本)或一(二进制)。在从语句变体的 Describe 返回的 RowDescription 中,格式代码尚不清楚,并且始终为零。

SASLInitialResponse (F) #
字节1('p')

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

Int32

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

String

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

Int32

紧随其后的 SASL 机制特定“初始客户端响应”的长度,如果不存在初始响应,则为 -1。

Byten

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

SASLResponse (F) #
字节1('p')

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

Int32

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

Byten

SASL 机制特定消息数据。

SSLRequest (F) #
Int32(8)

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

Int32(80877103)

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

StartupMessage (F) #
Int32

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

Int32(196608)

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

协议版本号后面跟着一个或多个参数名称和值字符串对。最后一个名称/值对之后需要一个零字节作为终止符。参数可以按任何顺序出现。 user 是必需的,其他参数是可选的。每个参数都以以下方式指定

String

参数名称。当前识别的名称是

user

要连接的数据库用户名。必需;没有默认值。

database

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

options

后端的命令行参数。(这已不推荐使用,取而代之的是设置单个运行时参数。)此字符串中的空格被视为分隔参数,除非用反斜杠 (\) 转义;写入 \\ 以表示文字反斜杠。

replication

用于以流式复制模式连接,在这种模式下,可以发出少量复制命令,而不是 SQL 语句。值可以是 truefalsedatabase,默认值为 false。有关详细信息,请参见 第 53.4 节

除了上述之外,还可以列出其他参数。以 _pq_. 开头的参数名称保留用于协议扩展,而其他参数被视为在后端启动时设置的运行时参数。此类设置将在后端启动期间应用(在解析任何命令行参数之后),并将充当会话默认值。

String

参数值。

Sync (F) #
字节1('S')

标识消息为同步命令。

Int32(4)

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

Terminate (F) #
Byte1('X')

标识消息为终止符。

Int32(4)

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

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。