【问题标题】:PostgreSQL protocol data representation format specification?PostgreSQL 协议数据表示格式规范?
【发布时间】:2013-10-26 18:34:05
【问题描述】:

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

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

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

更新

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

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

【问题讨论】:

    标签: postgresql protocols specifications manual


    【解决方案1】:

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

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

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

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

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

    一些信息:

    【讨论】:

    • 我真的不知道如果项目提交者说 这是微不足道的 要求协议 spec... 这让我彻底崩溃了...
    • 也许我不明白你的问题。纯文本格式有什么不清楚的地方? en.wikipedia.org/wiki/Plain_text
    • 啊,我重新阅读了手册,现在发现明确提到了文本协议。我更新了我的问题以指出这一点。说明书很清楚。谢谢,我很抱歉我的错。
    • @PavelStehule:因为没有纯文本这样的东西。它必须遵循一些语法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      整数的二进制表示使用网络字节顺序(大多数 有效字节优先)。对于其他数据类型,请参阅 文档或源代码以了解二进制表示。 请记住,复杂数据类型的二进制表示可能 跨服务器版本更改;文本格式通常越 便携的选择。

      (引用自文档,link

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

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多