9.3 9.4 9.5 9.6 10 11 12 13 14 15
阿里云PostgreSQL 问题报告 纠错本页面

55.10. 自协议2.0以来的变化总结

本节为那些试图将现有客户端库更新到协议3.0的开发人员提供了一个快速变更清单。

初始启动数据包使用灵活的字符串列表格式,而不是固定格式。请注意,现在可以直接在启动数据包中指定运行时参数的会话默认值。 (实际上,以前可以使用options字段来做到这一点,但考虑到options的有限宽度以及缺乏引用值中空格的任何方法,这并不是一种非常安全的技术。)

所有消息现在都在消息类型字节后面立即跟着长度计数(除了启动数据包,它们没有类型字节)。另外请注意,PasswordMessage现在有一个类型字节。

ErrorResponse和NoticeResponse('E'和'N') 消息现在包含多个字段,客户端代码可以从中组装出所需级别的错误消息。请注意, 单个字段通常不会以换行符结尾,而在旧协议中发送的单个字符串总是以换行符结尾。

ReadyForQuery('Z')消息包括事务状态指示器。

二进制行和数据行消息类型之间的区别已经消失;单个数据行消息类型用于以所有格式返回数据。 请注意,DataRow的布局已更改,以使其更容易解析。 此外,二进制值的表示已更改:它不再直接与服务器的内部表示形式绑定。

有一个新的扩展查询子协议,它增加了前端消息类型Parse、Bind、Execute、Describe、Close、Flush和Sync, 以及后端消息类型ParseComplete、BindComplete、PortalSuspended、ParameterDescription、NoData和CloseComplete。 现有客户端不必关心这个子协议,但利用它可能会提高性能或功能。

COPY数据现在封装到CopyData和CopyDone消息中。在COPY期间有一种明确定义的错误恢复方式。 特殊的\.最后一行不再需要,并且在COPY OUT期间不发送。 (在COPY IN期间仍然被识别为终止符,但其使用已不推荐,并最终将被移除。)支持二进制COPY。 CopyInResponse和CopyOutResponse消息包括指示列数和每列格式的字段。

FunctionCall和FunctionCallResponse消息的布局已更改。 FunctionCall现在可以支持将NULL参数传递给函数。它还可以处理以文本或二进制格式传递参数和检索结果。 不再需要考虑FunctionCall可能存在安全漏洞,因为它不提供对内部服务器数据表示的直接访问。

后端在连接启动期间向客户端库发送ParameterStatus('S')消息,以传达其认为对客户端库有趣的所有参数。 随后,每当这些参数中任何一个的活动值发生变化时,都会发送ParameterStatus消息。

RowDescription('T')消息携带了描述行的每列的新表OID和列号字段。它还显示了每列的格式代码。

光标响应('P')消息不再由后端生成。

通知响应('A')消息有一个额外的字符串字段,可以携带一个有效负载字符串, 从NOTIFY事件发送者传递过来。

空查询响应('I')消息曾包含一个空字符串参数;现已移除。