Snowflake中制表符作分隔符时带引号制表符的解析问题
解决Snowflake导入含内部制表符的双引号包裹字段TSV文件问题
问题核心
使用制表符作为字段分隔符时,被双引号包裹的字段内部包含制表符,设置ESCAPE_UNENCLOSED_FIELD为\t触发冲突错误,且当前文件格式无法正确解析该字段。
错误原因
ESCAPE_UNENCLOSED_FIELD参数值不能与FIELD_DELIMITER相同,两者冲突会导致Snowflake无法区分转义的分隔符与实际字段分隔符,因此报错。
正确配置方案
不需要设置ESCAPE_UNENCLOSED_FIELD,通过FIELD_OPTIONALLY_ENCLOSED_BY参数让Snowflake识别双引号包裹的字段,自动忽略内部的制表符(将其视为字段内容的一部分)。
修正后的文件格式
FILE_FORMAT = ( TYPE = CSV RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_DELIMITER = '\t' FIELD_OPTIONALLY_ENCLOSED_BY = '"' -- 直接用双引号,无需ASCII转义 TRIM_SPACE = TRUE EMPTY_FIELD_AS_NULL = TRUE NULL_IF = '' );
示例Copy Into命令
COPY INTO your_target_table FROM @your_stage/path/to/file.csv FILE_FORMAT = ( TYPE = CSV RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_DELIMITER = '\t' FIELD_OPTIONALLY_ENCLOSED_BY = '"' TRIM_SPACE = TRUE EMPTY_FIELD_AS_NULL = TRUE NULL_IF = '' );
原理说明
当字段被FIELD_OPTIONALLY_ENCLOSED_BY指定的双引号包裹时,Snowflake会将双引号内的所有内容(包括内部的制表符)作为单个字段值处理,不会将内部制表符解析为字段分隔符。无需额外设置转义符,因为转义符仅用于处理未被包裹字段中的分隔符,而此处的问题场景完全由包裹字段的逻辑覆盖。
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

