有用户想知道pg中copy命令使用二进制文件时二进制文件的格式,这个格式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段
第4、5、6、7、8段是第一条记录:第4段表示该元祖的列数,占2个字节;第5段表示第一列的长度,占4个字节;第6段是第一列的值;第7段是第二列的长度,占4个字节;第8段是第二列的值。
第9、10、11、12、13段是第二条记录,同上。
第14、15、16、17、18段是第三条记录,同上。
文件尾是第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
相关推荐
例如,你可以开发自定义的脚本或扩展,以适应特定的数据格式或处理逻辑。 5. **性能优化**: 在处理大量数据时,注意优化导出和导入过程。例如,分块导入可以减少内存压力,使用合适的压缩格式可以减小文件大小,...
与传统的COPY命令相比,它能更快地将数据写入数据库,因为它是以二进制格式传输的,而不是文本格式。此外,它利用PostgreSQL的流复制机制,可以并行处理多个数据流,进一步提高导入速度。这对于需要快速恢复数据或者...
该程序将json数据转换为PostgreSQL二进制。 它可用于将大量数据批量加载到PostgreSQL数据库。 最初,此操作是针对,但可以自定义为使用不同的数据和表结构。 建造 要构建程序,您需要。 将其检出到../jsmn目录,并...
PgBulkInsert是一个Java库,用于使用Binary COPY协议批量插入PostgreSQL。 它提供了PostgreSQL 的包装器: 是PostgreSQL特有的功能,它允许高效地批量导入表或从表导出数据。 与使用INSERT和SELECT相比,这是将...
- **使用二进制文件安装**:指导用户如何通过预编译的二进制包来安装PostgreSQL。 - **通过源码安装**:适合希望定制安装的高级用户。 - **配置PostgreSQL**:介绍了配置文件和启动服务的方法。 ##### 在Windows中...
1. PostgreSQL在不同操作系统的安装方法,包括Linux和UNIX系统中的二进制文件安装和源码安装,以及在Windows系统中的安装。 2. PostgreSQL在Linux和Unix上的配置步骤。 3. 在Windows中通过安装程序安装和配置...
PostgreSQL到sqlite(pg2sqlite) 易于使用的解决方案,可以从postgresql dump创建sqlite数据库。 默认脚本格式 尽可能快地 默默忽略不支持的Postgresql功能 gzip支持 在发行部分中,您可以下载pg2sqlite.jar的预...
- 二进制字符串:处理包含二进制数据的查询。 - 结果信息检索:获取查询的元数据,如列数、行数等。 - 结果数值检索:获取查询的数值结果。 - 非SELECT结果信息:处理非SELECT语句的返回结果。 **1.4. 异步查询处理...
3. **COPY命令**:在PostgreSQL中,COPY命令可以从一个文件系统文件快速地导入或导出数据。它可以大大提高导入效率。 4. **Oracle SQL*Loader**:Oracle提供了SQL*Loader工具,允许用户从外部文件加载数据到数据库...
pg_dump 备份可以使用 -F c 选项备份为二进制格式,压缩存储,并且可被 pg_restore 用于精细还原。pg_restore 可以指定还原的表,编辑 TOC 文件,定制还原的顺序、表、索引等。 五、pg_dump 备份恢复示例 1. 创建...
使用二进制格式的PostgreSQLCOPY实现,将数据快速导入到PostgreSQL。 因为有时jdbc/insert! 和朋友不够快。 该库使用基于类型的分派来确定正确的postgres二进制格式。 有关更多信息,请参见部分。 用法 莱宁根/...
描述中提到“资源来自pypi官网,解压后可用”,这意味着这个`.whl`文件是一个已经打包好的Python wheels文件,它是Python的一种二进制分发格式,旨在简化安装过程,特别是对于那些包含C扩展或者其他非纯Python代码的...
- **Linux/Unix安装**:通过二进制包或源码编译安装。 - **Windows安装**:使用安装向导进行快速部署。 - **配置步骤**:设置监听端口、认证方法等参数。 **3.2 创建示例数据库** - **创建数据库**:使用`CREATE ...
Bireme Bireme是用于Greenplum / HashData数据仓库的增量同步工具。 目前,它支持MySQL,PostgreSQL和MongoDB数据源。 是一个高级的,功能齐全的开源数据仓库,可对PB数据量进行强大... 是一个读取MySQL二进制日志并将
您是否知道PostgreSQL支持将二进制数据直接流进表或从表流出? 这意味着您可以选择自己喜欢的CSV或TSV或任何格式的文件,然后将其直接传输到现有的PostgreSQL表中。 如果您发疯了,您还可以获取一张表并将其直接...
它们提供了灵活的数据格式支持,如CSV、TEXT、JSON等,并能实现并发加载,以最大化硬件资源的利用率。 2. **5.23.0版本的特性** Greenplum 5.23.0版本带来了诸多改进和新功能,旨在提升性能、稳定性和用户体验。...
这可能涉及直接将图片的二进制数据转换为字符串,然后在SQL语句中插入,或者使用数据库提供的API直接处理内存中的图像数据。 10. **性能考虑**:使用临时文件可能会增加磁盘I/O操作,影响效率。直接存储在数据库中...
在GT3平台上配置GridFtp服务是一项关键任务,它涉及到分布式计算环境中的数据传输和资源共享。GridFtp是一种用于高效、安全传输大量数据的协议,是Globus Toolkit的重要组成部分。Globus Toolkit是一个开放源代码...
- struct:处理二进制数据的模块。 - textwrap:文本格式化工具,可以用于格式化文本段落。 6. 数据类型 - datetime:用于处理日期和时间值的模块。 - calendar:操作日期的模块。 - collections:包含高级数据结构...