使用ASCII 31字段分隔符作为Postgresql COPY分隔符

jae*_*ard 3 postgresql ascii escaping control-characters delimiter

我们将Postgres 9.3中的数据导出到文本文件中以供Spark使用.

我们希望使用ASCII 31字段分隔符作为分隔符而不是\ t,以便我们不必担心转义问题.

我们可以在这样的shell脚本中这样做:

#!/bin/bash
DELIMITER=$'\x1F'
echo "copy ( select * from table limit 1) to STDOUT WITH DELIMITER '${DELIMITER}'" | (psql ...) > /tmp/ascii31
Run Code Online (Sandbox Code Playgroud)

但是我们想知道,是否有可能在"纯"postgres中指定一个不可打印的字形作为分隔符?

编辑:我们试图按照http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html使用postgres转义约定

warehouse=> copy ( select * from table limit 1) to STDOUT WITH DELIMITER '\x1f';
Run Code Online (Sandbox Code Playgroud)

并收到

ERROR:  COPY delimiter must be a single one-byte character
Run Code Online (Sandbox Code Playgroud)

Gre*_*ius 6

尝试在您尝试用作分隔符的序列之前预先设置E. 例如,E'\x1f'而不是'\x1f'.没有E PostgreSQL将读取'\x1f'为四个单独的字符而不是十六进制转义序列,因此错误消息.

有关详细信息,请参阅PostgreSQL手册"使用C风格转义字符串常量".


bgo*_*dst 2

根据我的测试,以下两项均有效:

echo "copy (select 1 a, 2 b) to stdout with delimiter u&'\\001f'"| psql;
Run Code Online (Sandbox Code Playgroud)
echo "copy (select 1 a, 2 b) to stdout with delimiter e'\\x1f'"| psql;
Run Code Online (Sandbox Code Playgroud)