我正在阅读 PostgreSQL protocol document .该文档指定了消息流和包含格式,但没有提及实际数据字段如何以文本/二进制编码。
对于文本格式,完全没有提及。这是什么意思?我应该只使用 SQL 值表达式吗?或者有一些额外的文档吗?如果只是SQL值表达式,服务器会重新解析吗?
而且,我应该调查源代码的哪一部分以了解二进制数据是如何编码的?
更新
我又看了一遍手册,发现有提到文本格式。所以实际上 提到了文本表示,错过这一段是我的错。
The text representation of values is whatever strings are produced and accepted by the input/output conversion functions for the particular data type.
最佳答案
有两种可能的数据格式——文本或二进制。默认是文本格式——也就是说,只有服务器 <-> 客户端编码转换(或者当客户端和服务器使用相同的编码时什么都没有)。文本格式非常简单——微不足道——所有结果数据都被转换为人类可读的文本,并发送给客户端。像 bytea 这样的二进制数据也被转换为人类可读的文本——使用十六进制或 Base64 编码。输出很简单。文档中没有什么可描述的
postgres=# select current_date;
date
────────────
2013-10-27
(1 row)
在这种情况下 - 服务器向客户端发送字符串“2013-10-27”。前四个字节是长度,其他字节是数据。
输入有点困难,因为您可以将数据与查询分开 - 取决于您使用的 API。因此,如果您使用最简单的 API——那么 Postgres 期望将 SQL 语句与数据放在一起。一些复杂的 API 需要 SQL 语句和数据分开。
另一方面,由于任何数据类型的特定格式都有很大差异,因此使用二进制格式非常困难。任何 PostgreSQL 数据类型都有两个函数——发送和接收。这些函数用于将数据发送到输出消息流和从输入消息流中读取数据。类似的函数用于转换为纯文本或从纯文本转换(输出/输入函数)。一些客户端驱动程序能够从 PostgreSQL 二进制格式转换为主机二进制格式。
一些信息:
- libpq API http://www.postgresql.org/docs/9.3/static/libpq.html
- 您可以查看 PostgreSQL src 以发送/接收和输出/输入函数 - 查看 bytea 或日期实现 src/backend/utils/adt/date.c。 libpq 的实现也很有趣 src/interfaces/libpq -
关于PostgreSQL协议(protocol)数据表示格式规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19610388/