【发布时间】:2010-11-23 16:17:21
【问题描述】:
我正在尝试加载所有行都使用相同规则的文件。 (假设 HEADER 是单行)
HEADER1
HEADER2
.......
但不幸的是,当我尝试使用 LOAD DATA INFILE 语句时,我收到此错误:错误代码:1409 无法将具有固定大小行的文件中的值加载到变量。
这是我写的代码:
USE test;
DROP TABLE IF EXISTS EXAMPLE_H;
CREATE TABLE EXAMPLE_H(
ID CHAR(20),
SP CHAR(3),
IVA CHAR(11) PRIMARY KEY,
NLP CHAR(6),
DLP DATE,
DUVI DATE,
DELP CHAR(30),
FILLER CHAR(39),
VTLP CHAR(3),
FILL CHAR(49)
);
LOAD DATA INFILE 'BTILSP.TXT'
INTO TABLE test.EXAMPLE_H
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\n'
(ID, SP, IVA, NLP, @var_date_one, @var_date_two, DELP, FILLER, VTLP, FILL)
SET DLP = str_to_date(@var_date_one, '%Y%m%d',
DUVI = str_to_date(@var_date_two, '%Y%m%d');
我在阅读 this page 的底部(由 Ramam Pullella 评论)产生了这个想法,我在一些网站上发现了同样的解释,但我不明白为什么会出现这个错误。
如果我不使用 @var_date_one 和 @var_date_two 变量以及 STR_TO_DATE 函数,则日期不会按照 MySql 的需要呈现 - 文件中的日期类似于“20100701” - 那么该字段将包含全零或与我预期的日期不同的日期。如果我将 DLP 和 DUVI 更改为由 CHAR(8) 表示,那么它可以工作,但我不会使用 SQL DATE 比较和类似工具。
你能帮帮我吗? :) 非常感谢。
编辑:
问题似乎是由 LINE TERMINATED BY '' 给出的,因为这种行是“固定行(未定界)”。也许由于未知原因无法将其分配给变量,但它就是这样工作的。 文档说:
用户变量不能在以下情况下使用 以固定行格式加载数据 因为用户变量没有 显示宽度。
有什么建议吗?
重新编辑: 我已经阅读了该页面底部 Ryan Neve 的评论。他给出了一个将固定行读入变量的技巧:
LOAD DATA LOCAL INFILE '<file name>' INTO TABLE <table>
(@var1)
SET Date=str_to_date(SUBSTR(@var1,3,10),'%m/%d/%Y'),
Time=SUBSTR(@var1,14,8),
WindVelocity=SUBSTR(@var1,26,5),
WindDirection=SUBSTR(@var1,33,3),
WindCompass=SUBSTR(@var1,38,3),
WindNorth=SUBSTR(@var1,43,6),
WindEast=SUBSTR(@var1,51,6),
WindSamples=SUBSTR(@var1,61,4);
您认为这是一个好方法吗? :)
【问题讨论】:
-
在文档中提到它不适用于固定长度格式的数据。最好的最好,是重新修复您的插入文件。或者将其更改为 varchar,稍后执行类型转换。
-
@ajreal:谢谢!昨天我没有看你的答案,但我编辑了我的问题,我写了一些像你说的东西:)