PostgreSQL协议数据表示格式规范?

9
我正在阅读PostgreSQL协议文档。该文档规定了消息流和容纳格式,但没有提到实际数据字段如何以文本/二进制编码。
对于文本格式,根本没有提到。这是什么意思?我应该只使用SQL值表达式吗?还是有其他的文档?如果只是SQL值表达式,这是否意味着服务器会再次解析它们?
还有,我应该调查源代码的哪个部分来查看二进制数据如何编码?
更新
我再次阅读手册,并发现提到了文本格式。所以实际上确实提到了文本表示,是我的错漏了这一段。

值的文本表示是特定数据类型的输入/输出转换函数产生和接受的任何字符串。

3个回答

5

有两种可能的数据格式 - 文本或二进制。默认是文本格式 - 这意味着只有服务器<->客户端编码转换(当客户端和服务器使用相同的编码时,可能不需要转换)。文本格式非常简单 - 平凡 - 所有结果数据都被转换为人类可读的文本并发送给客户端。像bytea这样的二进制数据也会被转换为人类可读的文本 - 使用十六进制或Base64编码。输出很简单。文档中没有什么描述。

 postgres=# select current_date;
     date    
 ────────────
  2013-10-27
 (1 row)

在这种情况下 - 服务器向客户端发送字符串“2013-10-27”。前四个字节是长度,其他字节是数据。
输入有点困难,因为您可以根据使用的API将数据与查询分开。因此,如果您使用最简单的API,则Postgres会期望SQL语句与数据一起。一些复杂的API期望将SQL语句和数据分开。
另一方面,由于任何数据类型的特定格式不同,使用二进制格式显着困难。任何PostgreSQL数据类型都具有两个函数 - 发送和接收。这些函数用于将数据发送到输出消息流和从输入消息流中读取数据。类似的功能用于转换为/从纯文本(out/in函数)。一些客户端驱动程序能够将数据从PostgreSQL二进制格式转换为主机二进制格式。
一些信息:
- libpq API http://www.postgresql.org/docs/9.3/static/libpq.html - 您可以查看PostgreSQL src以获取send/recv和out/in函数 - 查看bytea或date实现src/backend/utils/adt/date.c。libpq的实现也很有趣,src/interfaces/libpq

7
如果项目贡献者表示要求协议规范是“微不足道”的话,我真的不知道该怎么办了...这让我完全崩溃了... - eonil
也许我没有理解你的问题。纯文本格式有什么不清楚的?http://en.wikipedia.org/wiki/Plain_text - Pavel Stehule
啊,我重新阅读了手册,现在发现明确提到了文本协议。我更新了我的问题来指出这一点。手册很清楚。谢谢,对于我的错误我很抱歉。 - eonil
4
@PavelStehule说:“因为并不存在所谓的纯文本,它必须遵循一定的语法。” - Yakov Galka

3

我找到的与PostgreSQL二进制格式最接近的规范是"libpqtypes"库的文档源代码。对于如此庞大的产品来说,文档状态确实很糟糕。


1
两个链接都无法打开。 - Daniil Iaitskov

1
数值的文本表示是由特定数据类型的输入/输出转换函数产生和接受的字符串。在传输表示中,没有尾随的空字符;如果前端希望将其处理为C字符串,则必须向接收到的值添加一个空字符。(顺便说一下,文本格式不允许嵌入空字符。)
整数的二进制表示使用网络字节序(最高有效字节先)。有关其他数据类型的二进制表示,请参阅文档或源代码以了解其二进制表示。请记住,复杂数据类型的二进制表示可能会随着服务器版本的更改而更改;文本格式通常是更可移植的选择。
(摘自文档,link
因此,二进制协议在版本之间不稳定,所以您应该将其视为实现细节,而不使用二进制表示。据我所知,文本表示只是SQL查询中文字面量的格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接