6

我正在阅读PostgreSQL 协议文档。该文档指定了消息流和包含格式,但没有提及实际数据字段如何以文本/二进制格式编码。

对于文本格式,根本没有提及。这是什么意思?我应该只使用 SQL 值表达式吗?或者有一些额外的文档?如果只是 SQL 值表达式,这是否意味着服务器会再次解析它们?

而且,我应该调查源代码的哪一部分来了解二进制数据是如何编码的?

更新

我又读了一遍手册,发现提到了文本格式。所以实际上提到了文本表示,错过了这一段是我的错。

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

4

3 回答 3

4

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

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

在这种情况下 - 服务器向客户端发送字符串“2013-10-27”。前四个字节是长度,其他字节是数据。

输入有点困难,因为您可以将数据与查询分开 - 取决于您使用的 API。因此,如果您使用最简单的 API - 那么 Postgres 期望 SQL 语句与数据一起使用。一些复杂的 API 需要将 SQL 语句和数据分开。

另一方面,由于任何数据类型的特定格式都不同,因此使用二进制格式非常困难。任何 PostgreSQL 数据类型都有两个函数——发送和接收。这些函数用于向输出消息流发送数据和从输入消息流中读取数据。类似的功能用于转换为/从纯文本(输出/输入功能)。一些客户端驱动程序能够从 PostgreSQL 二进制格式转换为主机二进制格式。

一些信息:

于 2013-10-27T05:18:39.273 回答
3

我能找到的最接近 PostgreSQL 二进制格式规范的东西是“libpqtypes”库的文档源代码。我知道,如此庞大的产品的文档状态很糟糕。

于 2014-11-06T08:57:21.960 回答
1

值的文本表示是特定数据类型的输入/输出转换函数生成和接受的任何字符串。在传输的表示中,没有尾随空字符;如果前端想要将接收到的值作为 C 字符串处理,则必须将其加一。(顺便说一下,文本格式不允许嵌入空值。)

整数的二进制表示使用网络字节顺序(最高有效字节在前)。对于其他数据类型,请查阅文档或源代码以了解二进制表示。请记住,复杂数据类型的二进制表示可能会因服务器版本而异;文本格式通常是更便携的选择。

(引自文档,链接

所以二进制协议在不同版本之间是不稳定的,所以你可能应该把它当作一个实现细节,而不是使用二进制表示。文本表示是 AFAICT,只是 SQL 查询中的文字格式。

于 2016-10-13T13:23:23.970 回答