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 是已插入、更新或删除的行数。
-
对于 SELECT 或 CREATE 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 语句。值可以是 true、false_或 _database,默认值为 false。有关详细信息,请参见 Section 55.4。
-
-
Byte1('S')
-
将消息标识为同步命令。
-
-
Int32(4)
-
包括自身在内,以字节为单位的消息内容长度。
-
-
Byte1('X')
-
将消息标识为终止。
-
-
Int32(4)
-
包括自身在内,以字节为单位的消息内容长度。
-