Redshift定义为NOT NULL的列允许空数据加载问题咨询
Redshift COPY命令未拦截NOT NULL列空值问题排查建议
问题关联COPY参数参考
ESCAPE
GZIP
DATEFORMAT 'auto'
TIMEFORMAT 'auto'
DELIMITER ','
ACCEPTINVCHARS '?'
COMPUPDATE TRUE
STATUPDATE TRUE
MAXERROR 0
TRUNCATECOLUMNS
NULL AS '\000'
EXPLICIT_IDS
排查建议
- 优先校验
NULL AS '\000'配置与源文件空值格式的匹配性:该配置仅会将源文件中八进制\000(NULL字节)识别为SQL NULL值。如果源文件最后一列的空值用行尾连续逗号(即,,)、空白字符表示,Redshift会将其识别为空字符串''而非SQL NULL,自然不会触发NOT NULL约束拦截,这是最后一列空值漏校验的高频原因。 - 检查源文件行尾与字段格式:如果源文件为CSV格式,需确认最后一列是否存在双引号未闭合、行尾附带不可见换行符/制表符的情况,这类异常会导致Redshift误判最后一列存在有效值,不会触发NULL校验。
- 验证
TRUNCATECOLUMNS参数影响:该参数除了截断超长字符字段值外,若最后一列的空值附带不可见超长空白字符,会被直接截断为空字符串存入表中,不会被识别为NULL触发约束。 - 小批量测试复现定位根因:
- 临时移除
TRUNCATECOLUMNS、ACCEPTINVCHARS参数,将NULL AS配置修改为NULL AS ''后加载小份测试数据,若此时触发NOT NULL报错即可确认是空值识别规则不匹配导致的问题。 - 若修改参数后仍无报错,执行查询
SELECT DISTINCT 问题列名, LENGTH(问题列名), ASCII(问题列名) FROM 表名确认该列实际存储的值,排查是否为未识别的不可见字符。
- 临时移除
内容的提问来源于stack exchange,提问作者Sachiko
相关产品推荐
相关产品推荐

