使用SQL Loader加载含可变长度及空白的TSV文件失败求助
解决SQL Loader加载TSV文件失败的问题
先揪出你遇到的核心矛盾,你的加载语句和TSV文件的格式完全不匹配,再加上数据行的小问题,咱们一步步来修正:
1. 修正字段分隔符(最致命的错误)
你要加载的是**TSV(制表符分隔值)**文件,但加载语句里错误地指定了逗号作为分隔符:
FIELDS TERMINATED BY ','
TSV的标准分隔符是制表符,必须改成:
FIELDS TERMINATED BY '\t'
2. 规范数据行格式
你提供的TSV内容排版有点混乱,正确的TSV应该每行对应一条记录,且字段数要和表结构(4个字段:code, name, information, surname)完全一致。哪怕是空白字段,也要保留制表符占位,比如正确的TSV内容应该是这样的(用制表符分隔):
code name information surname
1234 Peter Peter
1111 Carl exampleexample
Jhon
如果某行的字段数和表字段数不匹配,SQL Loader会直接报错,所以一定要确保每行的制表符分隔项是4个。
3. 处理空白/空字段
如果TSV里存在空白字段(无值的情况),可以在加载语句中用NULLIF把空白内容转换成数据库的NULL值,避免加载失败。同时添加TRAILING NULLCOLS,如果行尾字段缺失,自动填充NULL,比如:
( CODE NULLIF(CODE=''), NAME NULLIF(NAME=''), INFORMATION NULLIF(INFORMATION=''), SURNAME NULLIF(SURNAME='') )
要是字段前后有多余空格,还可以用TRIM函数处理,比如CODE CHAR(4) "TRIM(:CODE)"(根据字段实际类型调整)。
4. 修正后的完整加载语句
整合所有修正点,最终的加载控制文件内容应该是这样的:
OPTIONS (SKIP=1) LOAD DATA INFILE 'EXAMPLE.TSV' INTO TABLE PERSON FIELDS TERMINATED BY '\t' -- 你的TSV里没有用双引号包裹字段,这行可以直接删掉 -- OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS -- 自动处理行尾缺失的字段 ( CODE NULLIF(CODE=''), NAME NULLIF(NAME=''), INFORMATION NULLIF(INFORMATION=''), SURNAME NULLIF(SURNAME='') )
5. 额外检查项
- 确保
EXAMPLE.TSV的文件编码和数据库编码一致(比如UTF-8),避免乱码或加载失败 - 核对PERSON表的字段类型和TSV数据是否匹配,比如CODE是数字类型的话,TSV里的code值必须是有效数字(空值没问题)
内容的提问来源于stack exchange,提问作者Ragun
相关产品推荐
相关产品推荐

