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

使用ASCII 31字段分隔符作为Postgresql复制分隔符,postgresql,escaping,ascii,delimiter,control-characters,Postgresql,Escaping,Ascii,Delimiter,Control Characters,我们正在将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 但我

我们正在将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
但我们想知道,是否可以在“纯”postgres中指定一个不可打印的标志符号作为分隔符

编辑:我们试图根据使用postgres转义约定

收到

ERROR:  COPY delimiter must be a single one-byte character

根据我的测试,以下两项工作:

echo "copy (select 1 a, 2 b) to stdout with delimiter u&'\\001f'"| psql;


试着在你试图用作delimter的序列之前预先加上E。例如
E'\x1f'
而不是
'\x1f'
。没有E PostgreSQL将把
'\x1f'
读取为四个独立的字符,而不是十六进制转义序列,因此会显示错误消息


有关更多信息,请参阅。

我从Actian Matrix(Amazon Redshift的一个分支,都是postgres的衍生物)中提取了一个小文件,使用ASCII字符代码30的符号“记录分隔符”

这是该文件在VI中的外观示例:

C^^Private Property
D^^Private Passenger Business
E^^Private Passenger Non-Business
然后,我通过sftp将此文件移到承载PostgreSQL 9.5的机器上,并使用了以下copy命令,该命令似乎运行良好:

copy fmcsa.carrier_classes
from '/tmp/us_fmcsa_carrier_classes_mk4.txt'
delimiter u&'\001E'; 

postgres的每一个派生词,以及postgres本身似乎更喜欢一种稍微不同的符号。可惜我们没有一个标准

这两个都不能在psql shell中使用,都会产生“错误:复制分隔符必须是一个单字节字符”嗯,奇怪。您正在运行哪个postgres版本,以及什么操作系统?(我从运行在Windows 8.1上的
psql--version
,获得
psql(PostgreSQL)9.3.5
)实际上,当你说“psql shell”时,你的意思是你在上述命令中复制了双引号文本,并粘贴到
psql
提示符处?那是行不通的;双反斜杠是shell双引号字符串中的转义代码,在回显到
psql
之前将解析为单个反斜杠。
psql
看到的代码中只需要一个反斜杠。如果有帮助,请告诉我。有人解决了这个问题吗?我想做同样的事情。当我进行各种转义组合时,我得到了
错误:编码“UTF8”的字节序列无效:0x00
。回答得很好。因此,在Postgres脚本中,在任何类型的十六进制、正则表达式或特殊字符之前总是,总是,总是,总是加上E是非常重要的。有时它会在没有任何明显原因的情况下起作用,但总会有一次它不起作用。
unload ('SELECT btrim(class_cd) as class_cd, btrim(class_desc) as class_desc
FROM transport.stg.us_fmcsa_carrier_classes')
to '/tmp/us_fmcsa_carrier_classes_mk4.txt'
delimiter as '\036' leader;
C^^Private Property
D^^Private Passenger Business
E^^Private Passenger Non-Business
copy fmcsa.carrier_classes
from '/tmp/us_fmcsa_carrier_classes_mk4.txt'
delimiter u&'\001E';