Redshift UNLOAD命令双引号被转义为双对引号,如何输出单对双引号包裹的内容
Redshift UNLOAD命令导出CSV双引号转义问题解决方案
问题原因
你遇到的现象是Redshift UNLOAD的标准CSV转义规则导致的:当你在UNLOAD参数中指定CSV选项时,Redshift默认会将字段值中包含的双引号(")自动转义为两个连续的双引号(""),这是标准RFC 4180 CSV格式的默认转义规则,不是异常错误。
解决方案
有两种常用方案可以实现你要的单个双引号包裹内容的输出效果:
方案1:关闭CSV模式,手动构造输出格式
如果你的字段内容中没有逗号、换行等需要CSV模式自动处理的特殊字符,可以直接移除CSV参数,UNLOAD就不会触发自动双引号转义逻辑,你在查询中拼接的双引号会原样输出。
参考命令:
UNLOAD($$ select '"Jane"' as name $$) TO 's3://s3-bucket/test_' IAM_ROLE 'arn:aws:iam::xxxxxx:role/xxxxxx' HEADER DELIMITER ',' ALLOWOVERWRITE
方案2:保留CSV模式,修改默认引用符
如果你需要保留CSV模式自动处理逗号、换行等特殊字符的能力,可以通过QUOTE参数指定一个你的业务数据中不会出现的字符作为CSV的默认引用符,这样原字段中的双引号就不会被识别为需要转义的引用字符,会原样保留。
参考命令(指定单引号作为引用符为例):
UNLOAD($$ select '"Jane"' as name $$) TO 's3://s3-bucket/test_' IAM_ROLE 'arn:aws:iam::xxxxxx:role/xxxxxx' HEADER CSV DELIMITER ',' QUOTE AS '''' ALLOWOVERWRITE
如果你的数据中也存在单引号,可以替换为其他罕见字符(比如CHR(1)这类不可见控制字符)作为QUOTE值即可。
注意事项
如果选择方案1,需要自行确保字段内容中没有你指定的分隔符(这里是逗号),否则会出现CSV列错位的问题,这类场景更推荐使用方案2。
内容的提问来源于stack exchange,提问作者marcia12
相关产品推荐
相关产品推荐

