【发布时间】: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
我正在使用这个:
COPY(select field1, field2, field3 from table ) TO 'C://Program Files/PostgreSql//8.4//data//output.dat' WITH BINARY
要将某些字段导出到文件,其中之一是 ByteA 字段。现在,我需要使用定制程序读取文件。
如何解析这个文件?
【问题讨论】:
标签: postgresql
COPY...BINARY 生成的文件的一般格式在documentation 中进行了说明,并且非常重要。
bytea 内容是最容易处理的,因为它们没有被编码。
每个其他数据类型都有自己的编码规则,文档中没有描述,但在源代码中。来自文档:
为实际元组数据确定合适的二进制格式 您应该查阅 PostgreSQL 源代码,尤其是 *send 和 *recv 每列数据类型的函数(通常这些函数位于源的 src/backend/utils/adt/ 目录中 分布)。
【讨论】:
使用文本格式而不是二进制格式可能更容易(因此只需删除WITH BINARY)。文本格式具有更好的文档,旨在实现更好的互操作性。二进制格式更适合在 postgres 安装之间移动,即使在那里它们也存在版本不兼容问题。
文本格式会将 bytea 字段当作文本写入,并使用 \nnn 八进制表示编码任何不可打印的字符(除了一些特殊情况,它使用 C 样式 \x 模式进行编码,例如 @ 987654325@ 和 \t 等)这些都列在 COPY 文档中。
唯一需要注意的是,您需要绝对确定保存文件时使用的字符编码与读取文件时使用的字符编码相同。确保可打印字符映射到相同的数字。我会坚持使用 SQL_ASCII,因为它让事情变得更简单。
【讨论】: