PostgreSQL COPY TO导出文本时保留原生换行符的解决方案
默认COPY TO的TEXT格式会把字段内的换行转义为\n,是因为TEXT格式本身用换行符作为行记录的分隔标记,为了避免解析时把数据内的换行误判为行结束,才会强制转义字段内的控制字符,这个是格式层面的固有逻辑,没有直接的开关可以关闭。
下面两个方案都完全满足要求:不使用CSV格式,输出文件无表头、无列分隔符、无引号,完整保留原始换行效果。
方案1:通过psql无格式输出(零额外权限,操作最简单)
不需要走COPY的转义逻辑,直接用psql的纯结果输出模式写入文件即可:
psql -d postgres -At -o /tmp/out.txt -c "SELECT 'A line' || CHR(10) || 'Another line';"
参数解释:
-A:关闭对齐输出,不会插入列分隔符、填充空格-t:只输出数据本身,不打印表头、查询返回行数提示、边框等冗余内容-o:直接把结果写入指定文件,全程不会对换行做转义处理
执行后/tmp/out.txt的内容就是预期的两行纯文本:
A line Another line
方案2:服务端大对象导出(不依赖psql客户端,适合任意连接场景)
如果需要在服务端直接完成导出,不依赖psql的客户端参数,可以用大对象导出功能——大对象写入文件时会原样输出原始字节,不会做任何格式转义:
SELECT lo_export( lo_from_bytea(0, convert_to('A line' || CHR(10) || 'Another line', 'UTF8')), '/tmp/out.txt' );
注意使用该方法需要执行语句的数据库账号拥有目标路径的写入权限,以及大对象的操作权限。
内容的提问来源于stack exchange,提问作者Luís de Sousa
相关产品推荐
相关产品推荐

