自协议 2.0 以来的变化的概述

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 49. 前/后端协议 | 下一页

# 49.7. 自协议 2.0 以来的变化的概述

本节提供一个快速的变化检查列表，以便于那些试图将现有的客户端库更新到 3.0 协议的开发人员。

初始化的启动包用了一个灵活的字符串列表格式取代了固定的格式。 请注意，运行时参数的会话缺省值现在可以直接在启动包中声明。 (实际上，你可以在使用`options`字段之前干这件事情，但是因为`options`的宽度限制以及缺乏引用值中的空白的方法，这并不是很安全的技巧。)

现在所有的消息在消息类型字节后面都有一个长度计数(除了启动包之外，它没有类型字节)。同时还要注意现在 PasswordMessage 有一个类型字节。

ErrorResponse 和 NoticeResponse('`E`'和'`N`')消息现在包含多个字段，从这些字段里客户端代码可以组合出自己所希望的详细程度的错误消息。 请注意独立的字段通常不是用换行符终止的，虽然在老协议里发送的单个字符串总是会用换行符终止。

The ReadyForQuery('`Z`')消息包括一个事务状态指示符。

BinaryRow 和 DataRow 消息类型之间的区别不再存在了；单个 DataRow 消息类型用于返回所有格式的数据。 请注意 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 和字段号数据域。它同样还为每个字段显示了格式代码。

后端不再生成 CursorResponse('`P`')消息。

NotificationResponse('`A`')消息有一个额外的字符串域，它可以携带来自`NOTIFY`事件发送者的"装载（payload）"数据。

EmptyQueryResponse('`I`')以前包含一个空字符串参数；这个已经被删除了。

上一页 | 起始页 | 下一页
错误和通知消息字段 | 上一级 | PostgreSQL 编码约定