55.7. 消息格式#
本节介绍每条消息的详细格式。每条消息都标记为可由前端 (F)、后端 (B) 或两者 (F 和 B) 发送。请注意,虽然每条消息开头都包含一个字节计数,但消息格式的定义方式是无需参考字节计数即可找到消息结尾。这有助于有效性检查。(CopyData 消息是个例外,因为它构成了数据流的一部分;任何单个 CopyData 消息的内容本身无法解释。)
- AuthenticationOk (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(0)
指定身份验证成功。
- AuthenticationKerberosV5 (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(2)
指定需要 Kerberos V5 身份验证。
- AuthenticationCleartextPassword (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(3)
指定需要明文密码。
- AuthenticationMD5Password (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(12)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(5)
指定需要 MD5 加密密码。
- Byte4
加密密码时要使用的盐。
- AuthenticationGSS (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(7)
指定需要 GSSAPI 身份验证。
- AuthenticationGSSContinue (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32(8)
指定此消息包含 GSSAPI 或 SSPI 数据。
- Byte
n GSSAPI 或 SSPI 身份验证数据。
- AuthenticationSSPI (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(9)
指定需要 SSPI 身份验证。
- AuthenticationSASL (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32(10)
指定需要 SASL 身份验证。
消息正文是 SASL 身份验证机制列表,按服务器的优先顺序排列。最后一个身份验证机制名称后需要一个零字节作为终止符。对于每种机制,都有以下内容
- String
SASL 身份验证机制的名称。
- AuthenticationSASLContinue (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32(11)
指定此消息包含 SASL 质询。
- Byte
n SASL 数据,特定于正在使用的 SASL 机制。
- AuthenticationSASLFinal (B) #
- Byte1('R')
将消息标识为身份验证请求。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32(12)
指定 SASL 身份验证已完成。
- Byte
n SASL 结果“附加数据”,特定于正在使用的 SASL 机制。
- BackendKeyData (B) #
- Byte1('K')
将消息标识为取消密钥数据。如果前端希望以后能够发出 CancelRequest 消息,则必须保存这些值。
- Int32(12)
包括自身在内的消息内容长度(以字节为单位)。
- Int32
此后端的进程 ID。
- Int32
此后端的密钥。
- Bind (F) #
- Byte1('B')
将消息标识为 Bind 命令。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
目标门户的名称(空字符串选择未命名门户)。
- String
源准备语句的名称(空字符串选择未命名的准备语句)。
- Int16
后面跟随的参数格式代码数(下面用
C表示)。可以为零,表示没有参数或所有参数都使用默认格式(文本);或为一,在这种情况下,指定的格式代码应用于所有参数;或者可以等于参数的实际数量。- Int16[
C] 参数格式代码。每个目前必须为零(文本)或一(二进制)。
- Int16
后面跟随的参数值数(可能为零)。这必须与查询所需的的参数数相匹配。
接下来,对于每个参数,出现以下字段对
- Int32
参数值长度,以字节为单位(此计数不包括它本身)。可以为零。作为特殊情况,-1 表示 NULL 参数值。在 NULL 情况下,没有值字节跟随。
- Byte
n 参数值,采用关联格式代码指示的格式。
n是上述长度。
在最后一个参数之后,出现以下字段
- Int16
后面跟随的结果列格式代码数(下面用
R表示)。可以为零,表示没有结果列或所有结果列都应使用默认格式(文本);或为一,在这种情况下,指定的格式代码应用于所有结果列(如果有);或者可以等于查询的实际结果列数。- Int16[
R] 结果列格式代码。每个目前必须为零(文本)或一(二进制)。
- BindComplete (B) #
- Byte1('2')
将消息标识为绑定完成指示符。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- CancelRequest (F) #
- Int32(16)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(80877102)
取消请求代码。该值被选为在最高有效 16 位中包含
1234,在最低有效 16 位中包含5678。(为了避免混淆,此代码不得与任何协议版本号相同。)- Int32
目标后端的进程 ID。
- Int32
目标后端的密钥。
- Close (F) #
- Byte1('C')
将消息标识为 Close 命令。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Byte1
'
S' 用于关闭已准备好的语句;或 'P' 用于关闭门户。- String
要关闭的已准备好的语句或门户的名称(空字符串选择未命名的已准备好的语句或门户)。
- CloseComplete (B) #
- Byte1('3')
将消息标识为 Close-complete 指示符。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- CommandComplete (B) #
- Byte1('C')
将消息标识为命令完成响应。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
命令标记。这通常是一个单词,用于标识已完成的 SQL 命令。
对于
INSERT命令,标记为INSERT,其中oidrowsrows是插入的行数。如果rows为 1 且目标表具有 OID,则oid用于表示插入行的对象 ID,但 OID 系统列不再受支持;因此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 及更高版本中。)
- CopyData (F & B) #
- Byte1('d')
标识消息为
COPY数据。- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Byte
n 构成
COPY数据流一部分的数据。后端发送的消息将始终对应于单数据行,但前端发送的消息可能会任意划分数据流。
- CopyDone (F & B) #
- Byte1('c')
标识消息为
COPY完成指示符。- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- CopyFail (F) #
- Byte1('f')
标识消息为
COPY失败指示符。- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
报告为失败原因的错误消息。
- CopyInResponse (B) #
- Byte1('G')
标识消息为开始复制响应。现在前端必须发送复制数据(如果没有准备好这样做,请发送 CopyFail 消息)。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int8
0 表示整体
COPY格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参阅 COPY。- Int16
要复制的数据中的列数(如下用
N表示)。- Int16[
N] 用于每列的格式代码。每个目前必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有格式代码都必须为零。
- CopyOutResponse (B) #
- Byte1('H')
标识消息为开始复制响应。此消息后将紧跟复制数据。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int8
0 表示整体
COPY格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参阅 COPY。- Int16
要复制的数据中的列数(如下用
N表示)。- Int16[
N] 用于每列的格式代码。每个目前必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有格式代码都必须为零。
- CopyBothResponse (B) #
- Byte1('W')
标识消息为开始同时复制响应。此消息仅用于流复制。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int8
0 表示整体
COPY格式为文本(行由换行符分隔,列由分隔符分隔,等等)。1 表示整体复制格式为二进制(类似于 DataRow 格式)。有关更多信息,请参阅 COPY。- Int16
要复制的数据中的列数(如下用
N表示)。- Int16[
N] 用于每列的格式代码。每个目前必须为零(文本)或一(二进制)。如果整体复制格式为文本,则所有格式代码都必须为零。
- DataRow (B) #
- Byte1('D')
标识消息为数据行。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int16
后面跟随的列值数(可能为零)。
接下来,为每一列显示以下字段对
- Int32
列值的长度(以字节为单位,此计数不包括自身)。可以为零。作为特殊情况,-1 表示 NULL 列值。在 NULL 情况下,不会有值字节跟随。
- Byte
n 列的值,格式由关联的格式代码指示。
n是上述长度。
- Describe (F) #
- Byte1('D')
将消息标识为 Describe 命令。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Byte1
'
S' 用于描述已准备好的语句;或 'P' 用于描述门户。- String
要描述的已准备好的语句或门户的名称(空字符串选择未命名的已准备好的语句或门户)。
- EmptyQueryResponse (B) #
- Byte1('I')
将消息标识为对空查询字符串的响应。(这代替了 CommandComplete。)
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- ErrorResponse (B) #
- Byte1('E')
将消息标识为错误。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
消息正文由一个或多个已标识的字段组成,后跟一个零字节作为终止符。字段可以按任何顺序出现。对于每个字段,都有以下内容
- Byte1
一个标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。当前定义的字段类型列于 第 55.8 节 中。由于将来可能会添加更多字段类型,因此前端应静默忽略无法识别的类型的字段。
- String
字段值。
- Execute (F) #
- Byte1('E')
将消息标识为 Execute 命令。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
要执行的门户的名称(空字符串选择未命名的门户)。
- Int32
要返回的最大行数,如果门户包含返回行的查询(否则忽略)。零表示 “无限制”。
- Flush (F) #
- Byte1('H')
将消息标识为 Flush 命令。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- FunctionCall (F) #
- Byte1('F')
将消息标识为函数调用。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32
指定要调用的函数的对象 ID。
- Int16
后面跟的参数格式代码数量(以下表示为
C)。可以为零,表示没有参数或所有参数都使用默认格式(文本);或为一,在这种情况下,指定的格式代码应用于所有参数;或者可以等于实际参数数量。- Int16[
C] 参数格式代码。每个目前必须为零(文本)或一(二进制)。
- Int16
指定提供给函数的参数数量。
接下来,每个参数都会出现以下一对字段
- Int32
参数值的长度,以字节为单位(此计数不包括它本身)。可以为零。作为特例,-1 表示 NULL 参数值。在 NULL 情况下,不会跟随任何值字节。
- Byte
n 参数的值,格式由关联的格式代码指示。
n是上述长度。
在最后一个参数之后,会出现以下字段
- Int16
函数结果的格式代码。目前必须为零(文本)或一(二进制)。
- FunctionCallResponse (B) #
- Byte1('V')
将消息标识为函数调用结果。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32
函数结果值的长度,以字节为单位(此计数不包括它本身)。可以为零。作为特例,-1 表示 NULL 函数结果。在 NULL 情况下,不会跟随任何值字节。
- Byte
n 函数结果的值,格式由关联的格式代码指示。
n是上述长度。
- GSSENCRequest (F) #
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(80877104)
加密请求代码。该值被选为在最高有效 16 位中包含
1234,在最低有效 16 位中包含5680。(为避免混淆,此代码不得与任何协议版本号相同。)
- GSSResponse (F) #
- Byte1('p')
将消息标识为 GSSAPI 或 SSPI 响应。请注意,这也用于 SASL 和密码响应消息。可以从上下文中推断确切的消息类型。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Byte
n GSSAPI/SSPI 特定的消息数据。
- NegotiateProtocolVersion (B) #
- Byte1('v')
将消息标识为协议版本协商消息。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32
服务器为客户端请求的主协议版本支持的最新次要协议版本。
- Int32
服务器未识别的协议选项数。
然后,对于服务器未识别的协议选项,有以下内容
- String
选项名称。
- NoData (B) #
- Byte1('n')
将消息标识为无数据指示符。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- NoticeResponse (B) #
- Byte1('N')
将消息标识为通知。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
消息正文由一个或多个已标识的字段组成,后跟一个零字节作为终止符。字段可以按任何顺序出现。对于每个字段,都有以下内容
- Byte1
一个标识字段类型的代码;如果为零,则这是消息终止符,后面没有字符串。当前定义的字段类型列于 第 55.8 节 中。由于将来可能会添加更多字段类型,因此前端应静默忽略无法识别的类型的字段。
- String
字段值。
- NotificationResponse (B) #
- Byte1('A')
将消息标识为通知响应。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32
发出通知的后端进程的进程 ID。
- String
已发出通知的通道名称。
- String
从发出通知的进程传递的 “有效负载” 字符串。
- ParameterDescription (B) #
- Byte1('t')
将消息标识为参数描述。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int16
语句使用的参数数(可以为零)。
然后,对于每个参数,有以下内容
- Int32
指定参数数据类型的对象 ID。
- ParameterStatus (B) #
- Byte1('S')
将消息标识为运行时参数状态报告。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
正在报告的运行时参数的名称。
- String
参数的当前值。
- Parse (F) #
- Byte1('P')
将消息标识为 Parse 命令。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
目标预处理语句的名称(空字符串选择未命名的预处理语句)。
- String
要解析的查询字符串。
- Int16
指定的参数数据类型数(可以为零)。请注意,这并不表示查询字符串中可能出现的参数数,而只是前端希望预先指定类型的参数数。
然后,对于每个参数,有以下内容
- Int32
指定参数数据类型的对象 ID。在此处放置零等效于将类型留空。
- ParseComplete (B) #
- Byte1('1')
将消息标识为解析完成指示符。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- PasswordMessage (F) #
- Byte1('p')
将消息标识为密码响应。请注意,这也用于 GSSAPI、SSPI 和 SASL 响应消息。确切的消息类型可以从上下文中推断出来。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
密码(已加密,如果请求的话)。
- PortalSuspended (B) #
- Byte1('s')
将消息标识为门户暂停指示符。请注意,只有在达到执行消息的行计数限制时才会出现此消息。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- Query (F) #
- Byte1('Q')
将消息标识为简单查询。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
查询字符串本身。
- ReadyForQuery (B) #
- Byte1('Z')
标识消息类型。每当后端准备好进行新的查询周期时,都会发送 ReadyForQuery。
- Int32(5)
包括自身在内的消息内容长度(以字节为单位)。
- Byte1
当前后端事务状态指示符。如果空闲(不在事务块中),则可能的值为“
I”;如果在事务块中,则为“T”;如果在失败的事务块中(在块结束之前将拒绝查询),则为“E”。
- RowDescription (B) #
- Byte1('T')
将消息标识为行描述。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int16
指定一行中的字段数(可以为零)。
然后,对于每个字段,都有以下内容
- String
字段名称。
- Int32
如果可以将字段标识为特定表的列,则为表的对象 ID;否则为零。
- Int16
如果可以将字段标识为特定表的列,则为列的属性编号;否则为零。
- Int32
字段数据类型的对象 ID。
- Int16
数据类型大小(参见
pg_type.typlen)。请注意,负值表示可变宽度类型。- Int32
类型修饰符(参见
pg_attribute.atttypmod)。修饰符的含义因类型而异。- Int16
用于该字段的格式代码。当前为零(文本)或一(二进制)。在从 Describe 语句变体返回的 RowDescription 中,格式代码尚未知道,并且始终为零。
- SASLInitialResponse (F) #
- Byte1('p')
将消息标识为初始 SASL 响应。请注意,这也用于 GSSAPI、SSPI 和密码响应消息。确切的消息类型从上下文中推断出来。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- String
客户端选择的 SASL 身份验证机制的名称。
- Int32
后面跟随的 SASL 机制特定“初始客户端响应”的长度,如果没有初始响应,则为 -1。
- Byte
n SASL 机制特定的“初始响应”。
- SASLResponse (F) #
- Byte1('p')
将消息标识为 SASL 响应。请注意,这也用于 GSSAPI、SSPI 和密码响应消息。确切的消息类型可以从上下文中推断出来。
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Byte
n SASL 机制特定消息数据。
- SSLRequest (F) #
- Int32(8)
包括自身在内的消息内容长度(以字节为单位)。
- Int32(80877103)
请求代码。选择该值是为了在最高有效位中包含
1234,在最低有效位中包含5679。(为避免混淆,此代码不得与任何协议版本号相同。)
- StartupMessage (F) #
- Int32
包括自身在内的消息内容长度(以字节为单位)。
- Int32(196608)
协议版本号。最高有效位是主版本号(此处描述的协议为 3)。最低有效位是次要版本号(此处描述的协议为 0)。
协议版本号后跟一个或多个参数名称和值字符串。最后一个名称/值对后需要一个零字节作为终止符。参数可以按任何顺序出现。需要
user,其他参数是可选的。每个参数指定为- String
参数名称。当前识别的名称是
user用作连接的数据库用户名。必需;没有默认值。
database要连接的数据库。默认为用户名。
options后端的命令行参数。(这已被弃用,建议设置单独的运行时参数。)此字符串中的空格被认为是分隔参数,除非使用反斜杠 (
\) 转义;编写\\以表示一个文字反斜杠。replication用于以流复制模式连接,其中可以发出少量复制命令,而不是 SQL 语句。值可以是
true、false或database,默认值为false。有关详细信息,请参见第 55.4 节。
除了上述内容外,还可以列出其他参数。以
_pq_.开头的参数名称保留为协议扩展使用,而其他参数则视为在后端启动时设置的运行时参数。此类设置将在后端启动期间(在解析命令行参数(如果有)之后)应用,并将充当会话默认值。- String
参数值。
- 同步 (F) #
- Byte1('S')
将消息标识为同步命令。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
- 终止 (F) #
- Byte1('X')
将消息标识为终止。
- Int32(4)
包括自身在内的消息内容长度(以字节为单位)。
