Postgresql 中文操作指南

55.7. Message Formats #

本节介绍每条消息的详细格式。每条消息都标记为表示它是由前端 (F)、后端 (B) 还是两者 (F 和 B) 发送的。请注意,尽管每条消息在开头都包含一个字节计数,但消息格式的定义方式是可以找到消息结束而无需参考字节计数。这有助于进行有效性检查。(CopyData 消息除外,因为它形成数据流的一部分;任何单独 CopyData 消息的内容本身不能被解释。)

  • AuthenticationOk (B) #

  • AuthenticationKerberosV5 (B) #

  • AuthenticationCleartextPassword (B) #

  • AuthenticationMD5Password (B) #

  • AuthenticationGSS (B) #

  • AuthenticationGSSContinue (B) #

  • AuthenticationSSPI (B) #

  • AuthenticationSASL (B) #

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

  • AuthenticationSASLContinue (B) #

  • AuthenticationSASLFinal (B) #

  • BackendKeyData (B) #

  • Bind (F) #

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

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

  • BindComplete (B) #

  • CancelRequest (F) #

  • Close (F) #

  • CloseComplete (B) #

  • CommandComplete (B) #

  • 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) #

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

    • 在最后一段论点之后,将出现以下字段:

  • FunctionCallResponse (B) #

  • GSSENCRequest (F) #

  • GSSResponse (F) #

  • NegotiateProtocolVersion (B) #

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

  • NoData (B) #

  • NoticeResponse (B) #

    • 消息正文包含一个或多个已标识的字段,后跟一个零字节作为终止符。字段可以按任何顺序出现。每个字段都有如下内容:

  • NotificationResponse (B) #

  • ParameterDescription (B) #

    • 然后,对于每个参数,有以下项:

  • ParameterStatus (B) #

  • Parse (F) #

    • 然后,对于每个参数,有以下项:

  • ParseComplete (B) #

  • PasswordMessage (F) #

  • PortalSuspended (B) #

  • Query (F) #

  • ReadyForQuery (B) #

  • RowDescription (B) #

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

  • SASLInitialResponse (F) #

  • SASLResponse (F) #

  • SSLRequest (F) #

  • StartupMessage (F) #

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

  • Sync (F) #

  • Terminate (F) #

  • Byte1('R')

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

  • Int32(8)

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

  • Int32(0)

    • 指定身份验证成功。

  • Byte1('R')

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

  • Int32(8)

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

  • Int32(2)

    • 指定需要 Kerberos V5 身份验证。

  • Byte1('R')

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

  • Int32(8)

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

  • Int32(3)

    • 指定需要明文密码。

  • Byte1('R')

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

  • Int32(12)

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

  • Int32(5)

    • 指定需要 MD5 加密的密码。

  • Byte4

    • 加密密码时要使用的盐。

  • Byte1('R')

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

  • Int32(8)

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

  • Int32(7)

    • 指定需要 GSSAPI 身份验证。

  • Byte1('R')

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

  • Int32

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

  • Int32(8)

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

  • Byte_n_

    • GSSAPI 或 SSPI 身份验证数据。

  • Byte1('R')

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

  • Int32(8)

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

  • Int32(9)

    • 指定需要 SSPI 身份验证。

  • Byte1('R')

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

  • Int32

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

  • Int32(10)

    • 指定需要 SASL 认证。

  • String

    • SASL 认证机制的名称。

  • Byte1('R')

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

  • Int32

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

  • Int32(11)

    • 指定此消息包含 SASL 质询。

  • Byte_n_

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

  • Byte1('R')

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

  • Int32

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

  • Int32(12)

    • 指定 SASL 认证已完成。

  • Byte_n_

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

  • Byte1('K')

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

  • Int32(12)

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

  • Int32

    • 此后端的进程 ID。

  • Int32

    • 此后端的密钥。

  • Byte1('B')

    • 将消息标识为 Bind 命令。

  • Int32

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

  • String

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

  • String

    • 源预处理语句的名称(空字符串选择未命名的预处理语句)。

  • Int16

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

  • Int16[C]

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

  • Int16

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

  • Int32

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

  • Byte_n_

    • 参数的值,格式由相关格式代码指定。n 是上述长度。

  • Int16

    • 后续结果列格式代码的数量(如下表示为 R)。此值为零(表示没有结果列)或一(表示所有结果列都应使用默认格式(文本);或等于查询的实际结果列数量。

  • Int16[R]

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

  • Byte1('2')

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

  • Int32(4)

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

  • Int32(16)

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

  • Int32(80877102)

    • 取消请求代码。该值由 1234(位于最高有效位 16 位)和 5678(位于最低有效位 16 位)组合而成。(为避免混淆,此代码不得与任何协议版本号相同。)

  • Int32

    • 目标后端的进程 ID。

  • Int32

    • 目标后端的密钥。

  • Byte1('C')

    • 将消息标识为关闭命令。

  • Int32

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

  • Byte1

    • 'S' 为关闭已准备好的语句;或 'P' 为关闭门户。

  • String

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

  • Byte1('3')

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

  • Int32(4)

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

  • Byte1('C')

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

  • Int32

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

  • String

    • 命令标记。通常为一个单词,标识已完成的 SQL 命令。

    • 对于 INSERT 命令,标签是 INSERT _oid rows_ ,其中 rows 是插入的行数。如果 rows 为 1 并且目标表具有 OID,则 oid 用于成为插入行的对象 ID,但不再支持 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 及更高版本中。)

  • Byte1('d')

    • 将消息标识为 COPY 数据。

  • Int32

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

  • Byte_n_

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

  • Byte1('c')

    • 将消息标识为 COPY 完成指标。

  • Int32(4)

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

  • Byte1('f')

    • 将消息标识为 COPY 故障指标。

  • Int32

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

  • String

    • 作为一个故障原因要报告的错误消息。

  • Byte1('G')

    • 将消息标识为 Start Copy In 响应。前端现在必须发送复制输入数据(如果未准备就绪,请发送 CopyFail 消息)。

  • Int32

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

  • Int8

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

  • Int16

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

  • Int16[N]

    • 用于每列的格式代码。现在,每个代码都必须为 0(文本)或 1(二进制)。如果总体复制格式为文本,则全部必须为 0。

  • Byte1('H')

    • 将消息标识为 Start Copy Out 响应。此消息后面将跟随复制输出数据。

  • Int32

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

  • Int8

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

  • Int16

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

  • Int16[N]

    • 用于每列的格式代码。现在,每个代码都必须为 0(文本)或 1(二进制)。如果总体复制格式为文本,则全部必须为 0。

  • Byte1('W')

    • 将消息标识为 Start Copy Both 响应。此消息仅用于流复制。

  • Int32

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

  • Int8

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

  • Int16

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

  • Int16[N]

    • 用于每列的格式代码。现在,每个代码都必须为 0(文本)或 1(二进制)。如果总体复制格式为文本,则全部必须为 0。

  • Byte1('D')

    • 将消息标识为数据行。

  • Int32

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

  • Int16

    • 后面跟随的列值的数目(可能为 0)。

  • Int32

    • 列值长度(以字节为单位,此计数不包括它本身)。可以为 0。作为特殊情况,-1 表明为一个 NULL 列值。在 NULL 情况下,后面不会跟随任何值字节。

  • Byte_n_

    • 列值,格式由相关联的格式代码表明。n 是以上长度。

  • Byte1('D')

    • 将消息标识为一个 Describe 命令。

  • Int32

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

  • Byte1

    • S”,表示已准备好的声明;或“P”,表示门户。

  • String

    • 已准备好的声明或门户的名称(空字符串选择未命名的已准备好的声明或门户)。

  • Byte1('I')

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

  • Int32(4)

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

  • Byte1('E')

    • 将消息标识为错误。

  • Int32

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

  • Byte1

    • 一个标识字段类型的代码;如果为零,则这是消息终止符,不会跟随任何字符串。当前定义的字段类型在 Section 55.8中列出。由于未来可能添加更多字段类型,因此前端应该静默忽略未识别类型的字段。

  • String

    • The field value.

  • Byte1('E')

    • 将消息标识为 Execute 命令。

  • Int32

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

  • String

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

  • Int32

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

  • Byte1('H')

    • 将消息标识为 Flush 命令。

  • Int32(4)

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

  • Byte1('F')

    • 将消息标识为函数调用。

  • Int32

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

  • Int32

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

  • Int16

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

  • Int16[C]

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

  • Int16

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

  • Int32

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

  • Byte_n_

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

  • Int16

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

  • Byte1('V')

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

  • Int32

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

  • Int32

    • 函数结果值(不包括它本身)的长度(以字节为单位)。可以为零。作为一种特殊情况,-1 表示 NULL 函数结果。在 NULL 情况下,后面没有值字节。

  • Byte_n_

    • 函数结果的值,由相关的格式代码指示。n 是上述长度。

  • Int32(8)

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

  • Int32(80877104)

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

  • Byte1('p')

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

  • Int32

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

  • Byte_n_

    • GSSAPI/SSPI specific message data.

  • Byte1('v')

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

  • Int32

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

  • Int32

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

  • Int32

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

  • String

    • The option name.

  • Byte1('n')

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

  • Int32(4)

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

  • Byte1('N')

    • 标识消息为通知。

  • Int32

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

  • Byte1

    • 一个标识字段类型的代码;如果为零,则这是消息终止符,不会跟随任何字符串。当前定义的字段类型在 Section 55.8中列出。由于未来可能添加更多字段类型,因此前端应该静默忽略未识别类型的字段。

  • String

    • The field value.

  • Byte1('A')

    • 标识消息为通知响应。

  • Int32

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

  • Int32

    • 触发通知的后端进程的进程 ID。

  • String

    • 已触发通知的通道名称。

  • String

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

  • Byte1('t')

    • 标示该消息为参数描述。

  • Int32

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

  • Int16

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

  • Int32

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

  • Byte1('S')

    • 标示该消息为运行时参数状态报告。

  • Int32

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

  • String

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

  • String

    • 参数的当前值。

  • Byte1('P')

    • 标示该消息为 Parse 命令。

  • Int32

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

  • String

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

  • String

    • 要解析的查询字符串。

  • Int16

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

  • Int32

    • 指定参数数据类型的对象 ID。此处放置零相当于保留未指定的类型。

  • Byte1('1')

    • 标示该消息为 Parse 完成指示器。

  • Int32(4)

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

  • Byte1('p')

    • 标示该消息为密码响应。请注意,这也用于 GSSAPI、SSPI 和 SASL 响应消息。可以从内容中推导出确切的消息类型。

  • Int32

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

  • String

    • 密码(如果要求则加密)。

  • Byte1('s')

    • 将消息标识为门户暂停指示符。注意,这仅当达到执行消息的行数限制时才显示。

  • Int32(4)

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

  • Byte1('Q')

    • 标示该消息为简单查询。

  • Int32

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

  • String

    • The query string itself.

  • Byte1('Z')

    • 标示消息类型。准备好查询是在后端已准备好新的查询周期时发送的。

  • Int32(5)

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

  • Byte1

    • 当前后端事务状态指示器。如果空闲(不在事务块中),可能的取值为“I”;如果位于事务块中,可能的取值为“T”;如果位于失败的事务块中,则可能取值为“E”(在结束块之前将拒绝查询)。

  • Byte1('T')

    • 将消息标识为行描述。

  • Int32

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

  • Int16

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

  • String

    • The field name.

  • Int32

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

  • Int16

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

  • Int32

    • 字段数据类型的对象 ID。

  • Int16

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

  • Int32

    • 类型修饰符(参见 pg_attribute.atttypmod)。修饰符的含义因类型而异。

  • Int16

    • 用于字段的格式代码。当前将为 0(文本)或 1(二进制)。在从 Describe 语句变体返回的 RowDescription 中,格式代码尚未得知,且始终为 0。

  • Byte1('p')

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

  • Int32

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

  • String

    • 客户端选择的 SASL 认证机制的名称。

  • Int32

    • 随后出现的 SASL 机制特定的“初始客户端响应”的长度,或在没有初始响应的情况下为 -1。

  • Byte_n_

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

  • Byte1('p')

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

  • Int32

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

  • Byte_n_

    • SASL 特定机制的消息数据。

  • Int32(8)

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

  • Int32(80877103)

    • SSL 请求代码。该值被选为包含最高有效 16 位中的 1234 和最低有效 16 位中的 5679。(为避免混乱,此代码不得与任何协议版本号相同。)

  • Int32

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

  • Int32(196608)

    • 协议版本号。最高有效 16 位是主版本号(这里是所述协议的 3)。最低有效 16 位是次版本号(这里是所述协议的 0)。

  • String

    • 参数名称。当前识别的名称包括:

    • 除了上述内容外,还可以列出其他参数。以 _pq._ 开头的参数名称仅用于协议扩展,而其他名称则作为在后端启动时要设置的运行时参数。此类设置将在后端启动期间(在解析命令行参数(如有)之后)应用,并将作为会话默认设置。

  • String

    • The parameter value.

  • user

    • 连接数据库时要用的数据库用户名称。这是必需的;没有默认值。

  • database

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

  • options

    • 后端的命令行参数。(这已被弃用,而赞成设置单独的运行时参数。)此字符串中的空格将被视为分隔参数,除非使用反斜杠(\)进行转义;编写 \\ 来表示一个反斜杠。

  • replication

    • 用于在流复制模式下连接,其中可以发出小型的复制命令,而不是 SQL 语句。值可以是 truefalse_或 _database,默认值为 false。有关详细信息,请参见 Section 55.4

  • Byte1('S')

    • 将消息标识为同步命令。

  • Int32(4)

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

  • Byte1('X')

    • 将消息标识为终止。

  • Int32(4)

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