【问题标题】:Parsing COPY...WITH BINARY results解析 COPY...WITH BINARY 结果
【发布时间】:2013-01-31 14:30:20
【问题描述】:

我正在使用这个:

COPY(select field1, field2, field3 from table ) TO 'C://Program Files/PostgreSql//8.4//data//output.dat' WITH BINARY

要将某些字段导出到文件,其中之一是 ByteA 字段。现在,我需要使用定制程序读取文件。

如何解析这个文件?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    COPY...BINARY 生成的文件的一般格式在documentation 中进行了说明,并且非常重要。

    bytea 内容是最容易处理的,因为它们没有被编码。

    每个其他数据类型都有自己的编码规则,文档中没有描述,但在源代码中。来自文档:

    为实际元组数据确定合适的二进制格式 您应该查阅 PostgreSQL 源代码,尤其是 *send 和 *recv 每列数据类型的函数(通常这些函数位于源的 src/backend/utils/adt/ 目录中 分布)。

    【讨论】:

    • 谢谢!在​​您指出的文档的帮助下,我实现了一个简单的解析器来读取整个文件。这很简单,因为我的所有字段都是 Varchar,除了一个 ByteA。
    【解决方案2】:

    使用文本格式而不是二进制格式可能更容易(因此只需删除WITH BINARY)。文本格式具有更好的文档,旨在实现更好的互操作性。二进制格式更适合在 postgres 安装之间移动,即使在那里它们也存在版本不兼容问题。

    文本格式会将 bytea 字段当作文本写入,并使用 \nnn 八进制表示编码任何不可打印的字符(除了一些特殊情况,它使用 C 样式 \x 模式进行编码,例如 @ 987654325@ 和 \t 等)这些都列在 COPY 文档中。

    唯一需要注意的是,您需要绝对确定保存文件时使用的字符编码与读取文件时使用的字符编码相同。确保可打印字符映射到相同的数字。我会坚持使用 SQL_ASCII,因为它让事情变得更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2021-10-14
      • 2015-09-15
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多