Skip to content

Latest commit

 

History

History
181 lines (68 loc) · 4.43 KB

20180510_01.md

File metadata and controls

181 lines (68 loc) · 4.43 KB

PostgreSQL copy (指定 QUOTE,ESCAPE,DELIMITER, 分隔符等, 支持ascii单字节字符...) single byte char 的输入

作者

digoal

日期

2018-05-09

标签

PostgreSQL , copy , 分隔符 , 包围符号 , 转义 , unicode


背景

PostgreSQL 可以通过COPY批量导入或导出数据,如果是文件操作是在数据库的SERVER端操作,如果是STDIN, STDOUT则是通过协议透传到客户端。

Command:     COPY  
Description: copy data between a file and a table  
Syntax:  
COPY table_name [ ( column_name [, ...] ) ]  
    FROM { 'filename' | PROGRAM 'command' | STDIN }  
    [ [ WITH ] ( option [, ...] ) ]  
  
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }  
    TO { 'filename' | PROGRAM 'command' | STDOUT }  
    [ [ WITH ] ( option [, ...] ) ]  
  
where option can be one of:  
  
    FORMAT format_name  
    OIDS [ boolean ]  
    FREEZE [ boolean ]  
    DELIMITER 'delimiter_character'  
    NULL 'null_string'  
    HEADER [ boolean ]  
    QUOTE 'quote_character'  
    ESCAPE 'escape_character'  
    FORCE_QUOTE { ( column_name [, ...] ) | * }  
    FORCE_NOT_NULL ( column_name [, ...] )  
    FORCE_NULL ( column_name [, ...] )  
    ENCODING 'encoding_name'  

COPY命令如下,允许用户指定格式,比如分隔符等。

QUOTE

ESCAPE

DELIMITER

以上三个必须是single one-byte字符。如果是特殊字符如何输入呢?

特殊字符作为QUOTE, ESCAPE, DELIMITER

可以使用escape或unicode模式输入特殊字符。

例如TAB作为分隔符时,这样输入

postgres=# copy aa from '/home/digoal/aa.csv' with (delimiter U&'\0009');  
COPY 10  
  
postgres=# copy aa from '/home/digoal/aa.csv' with (delimiter E'\t');  
COPY 10  

使用ascii可以得到字符的ASCII码

postgres=# select ascii(E'\t');  
 ascii   
-------  
     9  
(1 row)  

unicode的写法,请参考末尾文档。

参考

《PostgreSQL 转义、UNICODE、与SQL注入》

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

digoal's wechat