PostgreSQL copy (quote,DELIMITER,…) single byte char 的输入
背景
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注入》