`

PostgreSQL中copy命令以二进制形式传输数据的二进制格式

阅读更多

有用户想知道pgcopy命令使用二进制文件时二进制文件的格式,这个格式pg的使用文档里其实已经有了,这儿结合例子说明的更具体一些,现解析如下:

先看一下copy命令的语法,然后做个例子,根据例子解析一下二进制文件的格式。

COPY命令用于在外部文件(客户端)和表之间传送数据,语法如下:

COPY tablename [ ( column [, ...] ) ]

    FROM { 'filename' | STDIN }

    [ [ WITH ]

          [ BINARY ]

          [ OIDS ]

          [ DELIMITER [ AS ] 'delimiter' ]

          [ NULL [ AS ] 'null string' ]

          [ CSV [ HEADER ]

                [ QUOTE [ AS ] 'quote' ]

                [ ESCAPE [ AS ] 'escape' ]

                [ FORCE NOT NULL column [, ...] ]

 

COPY { tablename [ ( column [, ...] ) ] | ( query ) }

    TO { 'filename' | STDOUT }

    [ [ WITH ]

          [ BINARY ]

          [ OIDS ]

          [ DELIMITER [ AS ] 'delimiter' ]

          [ NULL [ AS ] 'null string' ]

          [ CSV [ HEADER ]

                [ QUOTE [ AS ] 'quote' ]

                [ ESCAPE [ AS ] 'escape' ]

                [ FORCE QUOTE column [, ...] ]

 

下面是pg7.3版本以前的语法,后续的版本仍然支持

COPY [ BINARY ] table_name [ WITH OIDS ]

    FROM { 'filename' | STDIN }

    [ [USING] DELIMITERS 'delimiter' ]

    [ WITH NULL AS 'null string' ]

 

COPY [ BINARY ] table_name [ WITH OIDS ]

    TO { 'filename' | STDOUT }

    [ [USING] DELIMITERS 'delimiter' ]

    [ WITH NULL AS 'null string' ]

   

使用copy命令的例子:

1

命令copy to 涉及的表copybinarytest的定义

beigang=# \d+ copybinarytest

                        资料表 "enterprisedb.copybinarytest"

  栏位   |         型别          | 修饰词 |   存储   | Stats target | 描述

---------+-----------------------+--------+----------+--------------+------

 id      | numeric(10,0)         |        | main     |              |

 content | character varying(30) |        | extended |              |

OIDs:

 

2

copybinarytest的记录

beigang=# select * from copybinarytest;

 id |   content

----+-------------

  1 | beigang

  2 | copy binary

  3 | abc

(3 行记录)

 

3

创建命令copy from 涉及的表copybinarytest2

beigang=# create table copybinarytest2 as select * from copybinarytest where 1=8;

SELECT 0

 

4

命令copy from 涉及的表copybinarytest2的定义

beigang=# \d+ copybinarytest2;

                        资料表 "enterprisedb.copybinarytest2"

  栏位   |         型别          | 修饰词 |   存储   | Stats target | 描述

---------+-----------------------+--------+----------+--------------+------

 id      | numeric(10,0)         |        | main     |              |

 content | character varying(30) |        | extended |              |

OIDs:

 

5

copy to命令以二进制形式把copybinarytest表的内容拷贝到binary文件中

beigang=# copy binary copybinarytest to 'binary';

COPY 3

beigang=#

 

6

Binary文件的内容如下图:

 


 

 

Copy命令二进制文件的格式如下:

二进制格式

    二进制格式的文件由一个文件头、数据(零个或多个元组)和文件尾构成。文件头和数据按网络字节顺序表示。

 

文件头

    文件头由15个字节的固定区域和一个变长的扩展区域组成。固定区域包括:

       签名

              11个字节的序列PGCOPY\nFF\r\n\0

       标志位

              32位的整数。位的编号从0(最低位)到31(最高位)。当前只有一个标志位被使用,它是第16位,如果它的值是1,表示含有OID,如果它的值是0,表示不含OID。其它的标志位永远是0

       扩展区域

              首先是一个32位的整数,表示扩展区域的长度,不包括这个32位的整数自身。当前,它的值是0。第一个元组紧跟在它的后面。

 

元组

    每个元组以一个16位的整数开始,表示元组中域的个数。然后是元组中的每个域。每个域由一个32位的整数开始,它表示域的长度,后面跟着域的数据,-1表示域的值为空值。如果文件中包含OID,则它的值跟在元组的第一个16位整数的后面,而且就算组的域的个数时,OID不被计算在内,它也由一个32位的整数开始,表示OID的长度,当前,OID的长度固定是4字节,以后可能扩展到8字节。

文件尾

    文件尾包含一个16位的整数,它的值是-1

7

确认copybinarytest2表中没有记录

beigang=# select * from copybinarytest2;

 id | content

----+---------

(0 行记录)

 

8

copy from命令把binary文件中的数据拷贝到表从opybinarytest

beigang=# copy binary copybinarytest2 from 'binary';

COPY 3

 

9

确认表copybinarytest2的内容和copybinarytest相同。

beigang=# select * from copybinarytest2;

 id |   content

----+-------------

  1 | beigang

  2 | copy binary

  3 | abc

(3 行记录)

 

以上面的例子为例解析Copy命令二进制文件格式


 

上图是copy命令导出的二进制数据文件,图中用红色竖线做分隔符,把二进制文件分成不同的段。蓝色数字表示各段的编号,

其中文件头包括第1段到第3段。

       1段是11个字节的序列PGCOPY\nFF\r\n\0;第2段是标志位,占4个字节;第3段是扩展区域,至少4个字节,根据情况可能更多。

元祖包括第4段到第18

              45678段是第一条记录:第4段表示该元祖的列数,占2个字节;第5段表示第一列的长度,占4个字节;第6段是第一列的值;第7段是第二列的长度,占4个字节;第8段是第二列的值。

              910111213段是第二条记录,同上。

              1415161718段是第三条记录,同上。

文件尾是第19段,占2个字节。

 

参考:

http://www.postgresql.org/docs/9.2/static/sql-copy.html

src/backend/commands/copy.c

 

 

-----------------

转载请著明出处:
blog.csdn.net/beiigang
beigang.iteye.com

  • 大小: 7.5 KB
  • 大小: 8.8 KB
0
2
分享到:
评论

相关推荐

    postgresql 导入导出

    例如,你可以开发自定义的脚本或扩展,以适应特定的数据格式或处理逻辑。 5. **性能优化**: 在处理大量数据时,注意优化导出和导入过程。例如,分块导入可以减少内存压力,使用合适的压缩格式可以减小文件大小,...

    pgcopy:使用二进制副本快速加载数据

    与传统的COPY命令相比,它能更快地将数据写入数据库,因为它是以二进制格式传输的,而不是文本格式。此外,它利用PostgreSQL的流复制机制,可以并行处理多个数据流,进一步提高导入速度。这对于需要快速恢复数据或者...

    json2pgcopy:将json数据转换为PostgreSQL复制二进制格式的实用程序

    该程序将json数据转换为PostgreSQL二进制。 它可用于将大量数据批量加载到PostgreSQL数据库。 最初,此操作是针对,但可以自定义为使用不同的数据和表结构。 建造 要构建程序,您需要。 将其检出到../jsmn目录,并...

    PgBulkInsert:Java库,可使用二进制COPY协议高效地批量插入PostgreSQL

    PgBulkInsert是一个Java库,用于使用Binary COPY协议批量插入PostgreSQL。 它提供了PostgreSQL 的包装器: 是PostgreSQL特有的功能,它允许高效地批量导入表或从表导出数据。 与使用INSERT和SELECT相比,这是将...

    PostgreSQL从菜鸟到专家

    - **使用二进制文件安装**:指导用户如何通过预编译的二进制包来安装PostgreSQL。 - **通过源码安装**:适合希望定制安装的高级用户。 - **配置PostgreSQL**:介绍了配置文件和启动服务的方法。 ##### 在Windows中...

    Postgresql从入门到精通

    1. PostgreSQL在不同操作系统的安装方法,包括Linux和UNIX系统中的二进制文件安装和源码安装,以及在Windows系统中的安装。 2. PostgreSQL在Linux和Unix上的配置步骤。 3. 在Windows中通过安装程序安装和配置...

    postgresql-to-sqlite:易于使用的解决方案,可以从Postgresql Dump创建sqlite数据库

    PostgreSQL到sqlite(pg2sqlite) 易于使用的解决方案,可以从postgresql dump创建sqlite数据库。 默认脚本格式 尽可能快地 默默忽略不支持的Postgresql功能 gzip支持 在发行部分中,您可以下载pg2sqlite.jar的预...

    PostgreSQL数据库学习手册之libpq.doc

    - 二进制字符串:处理包含二进制数据的查询。 - 结果信息检索:获取查询的元数据,如列数、行数等。 - 结果数值检索:获取查询的数值结果。 - 非SELECT结果信息:处理非SELECT语句的返回结果。 **1.4. 异步查询处理...

    SQL语句导入导出大全

    3. **COPY命令**:在PostgreSQL中,COPY命令可以从一个文件系统文件快速地导入或导出数据。它可以大大提高导入效率。 4. **Oracle SQL*Loader**:Oracle提供了SQL*Loader工具,允许用户从外部文件加载数据到数据库...

    PostgreSQL 备份恢复技术手册 DBA必备

    pg_dump 备份可以使用 -F c 选项备份为二进制格式,压缩存储,并且可被 pg_restore 用于精细还原。pg_restore 可以指定还原的表,编辑 TOC 文件,定制还原的顺序、表、索引等。 五、pg_dump 备份恢复示例 1. 创建...

    clj-pgcopy:从Clojure将数据快速导入Postgres

    使用二进制格式的PostgreSQLCOPY实现,将数据快速导入到PostgreSQL。 因为有时jdbc/insert! 和朋友不够快。 该库使用基于类型的分派来确定正确的postgres二进制格式。 有关更多信息,请参见部分。 用法 莱宁根/...

    PyPI 官网下载 | django_postgres_copy-0.2.0-py2.py3-none-any.whl

    描述中提到“资源来自pypi官网,解压后可用”,这意味着这个`.whl`文件是一个已经打包好的Python wheels文件,它是Python的一种二进制分发格式,旨在简化安装过程,特别是对于那些包含C扩展或者其他非纯Python代码的...

    postgreSQL经典教程

    - **Linux/Unix安装**:通过二进制包或源码编译安装。 - **Windows安装**:使用安装向导进行快速部署。 - **配置步骤**:设置监听端口、认证方法等参数。 **3.2 创建示例数据库** - **创建数据库**:使用`CREATE ...

    bireme:Bireme是Greenplum HashData数据仓库的增量同步工具

    Bireme Bireme是用于Greenplum / HashData数据仓库的增量同步工具。 目前,它支持MySQL,PostgreSQL和MongoDB数据源。 是一个高级的,功能齐全的开源数据仓库,可对PB数据量进行强大... 是一个读取MySQL二进制日志并将

    node-pg-copy-streams:从COPY TO COPY复制到node-postgres。 从一个数据库流到另一个数据库

    您是否知道PostgreSQL支持将二进制数据直接流进表或从表流出? 这意味着您可以选择自己喜欢的CSV或TSV或任何格式的文件,然后将其直接传输到现有的PostgreSQL表中。 如果您发疯了,您还可以获取一张表并将其直接...

    greenplum-loaders-5.23.0-rhel7-x86_64.zip

    它们提供了灵活的数据格式支持,如CSV、TEXT、JSON等,并能实现并发加载,以最大化硬件资源的利用率。 2. **5.23.0版本的特性** Greenplum 5.23.0版本带来了诸多改进和新功能,旨在提升性能、稳定性和用户体验。...

    怎样用VBA将EXCEL中的图片存入Oracle数据库(利用临时文件方式)

    这可能涉及直接将图片的二进制数据转换为字符串,然后在SQL语句中插入,或者使用数据库提供的API直接处理内存中的图像数据。 10. **性能考虑**:使用临时文件可能会增加磁盘I/O操作,影响效率。直接存储在数据库中...

    在GT3上安装GridFtp服务的配置

    在GT3平台上配置GridFtp服务是一项关键任务,它涉及到分布式计算环境中的数据传输和资源共享。GridFtp是一种用于高效、安全传输大量数据的协议,是Globus Toolkit的重要组成部分。Globus Toolkit是一个开放源代码...

    python第三方库文档

    - struct:处理二进制数据的模块。 - textwrap:文本格式化工具,可以用于格式化文本段落。 6. 数据类型 - datetime:用于处理日期和时间值的模块。 - calendar:操作日期的模块。 - collections:包含高级数据结构...

Global site tag (gtag.js) - Google Analytics