使用默认\N为空值时如何COPY整数列空值到Redshift
Redshift COPY加载整数列\N空值报错处理
问题表现
S3上存储的CSV文件中,整数列空值被导出为\N,文件字段结构为:
integer,string,string,integer
示例行内容:
4,"mystring","\N","\N"
使用如下COPY语句加载数据时,整数列抛出Invalid digit, Value 'N', Pos 0, Type: Short报错,但字符串列可以正常识别\N为空值,要求不修改默认的NULL AS配置解决问题:
COPY table FROM 's3location' CREDENTIALS '----' delimiter ',' removequotes ESCAPE COMPUPDATE ON ACCEPTINVCHARS
问题原因
Redshift COPY默认的空值识别规则存在类型差异:
- 未被引号包裹的
\N,会被所有数据类型的列识别为NULL,属于默认行为,无需额外配置 - 被双引号包裹的
"\N",仅字符串类型列会识别为空值,整数、数值、日期等非字符串列会直接把引号内的内容作为字面量解析,读到字符'N'时就会触发数字格式不匹配报错。
当前语句同时配置ESCAPE和REMOVEQUOTES时,会进一步干扰反斜杠的转义逻辑,加剧非字符串列的解析失败问题。
解决方法
不需要修改默认NULL AS取值,任选一种方案即可:
- 调整文件导出逻辑:整数、数值类非字符串列的空值
\N不要加双引号包裹,直接输出无引号的\N即可被默认规则正常识别为空。这类列的正常值本身不会包含逗号、引号等需要转义的特殊字符,不需要加引号包裹,不会破坏CSV格式。 - 调整COPY语句参数:去掉手动配置的
delimiter ',' removequotes ESCAPE,改用FORMAT CSV参数,让Redshift按标准CSV规则解析字段,该模式下会统一处理所有类型列的带引号空值识别,调整后语句如下:
COPY table FROM 's3location' CREDENTIALS '----' FORMAT CSV COMPUPDATE ON ACCEPTINVCHARS
内容的提问来源于stack exchange,提问作者timetofly
相关产品推荐
相关产品推荐

