讲解基础的PBDES报文
P/B/D/E/S报文
P (Parse)
客户端发送 SQL 模板,如 SELECT name FROM users WHERE id = $1。
服务端返回1 (ParseComplete):服务器确认解析成功。
B (Bind)
客户端发送参数值,如 123。
服务端返回2 (BindComplete):服务器确认绑定成功。
D (Describe)
客户端请求描述已经绑定好参数的 Portal。
服务端返回T (RowDescription):服务器返回结果集结构(有一列 name)。
E (Execute)
客户端命令服务器执行查询。
服务端返回D (DataRow):服务器返回查询到的数据行(如 'Alice')。以及C (CommandComplete):服务器确认执行成功(如 SELECT 1)
S (Sync)
客户端请求同步状态。
服务端返回Z (ReadyForQuery):服务器确认已空闲,可以接受下一次查询。
P/D/S...B/E/S和P/B/D/E/S的区别
序列 A (带提前描述):>P/D/S ... >B/E/S,用于强制二进制传输
阶段一:准备与规划 (P/D/S)
目标:完成 SQL 模板的解析,并全面了解这个模板的所有信息(需要什么参数、返回什么结构)。
产出:客户端拥有了执行该查询所需的全部 “元数据”。
类比:你去一家新餐厅,先仔细研究菜单(Describe),知道了每道菜的成分和价格,然后再决定点什么。
阶段二:执行与获取 (B/E/S)
目标:使用具体参数,快速执行并获取结果。
过程:因为前期准备充分,这个阶段的执行可以非常高效和精准。
类比:你已经研究好菜单了,直接告诉服务员你的选择(Bind),然后等待上菜(Execute)。
序列 B (隐含描述):>P/B/D/E/S
而序列 B 更像是 “边点菜边问”:
你告诉服务员一个菜名(Parse)。
你说 “就按这个做”(Bind)。
然后你才问服务员:“这道菜里有什么?”(Describe)。
最后才说:“好,上吧。”(Execute)。
总结
因此序列A将 “准备” 和 “执行” 两个环节解耦能够获取更加详细的信息。
以执行“Select '{a, Null}'::text[];”为例子,序列A的Bind的部分报文如下:
Result formats: 1
Format: Binary(1) 识别成的二进制数组类型,
序列B的Bind的部分报文则如下:
Result formats: 0 未进行识别,当成的字符串处理