标签
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注入》