MySQL:如何加载固定的数据
我试图加载一个文件,所有的行都使用相同的规则。 (假设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');
我有这个想法阅读这个页面的底部(由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);
你认为这是一个好办法吗? :)
我不是专家,但在我看来,如果这些字段被一个空字符串终止,那么他们必须是固定的大小; 必须有一些方法来确定领域之间的界限,如果没有终结者,那么他们几乎必须是固定的大小。
我注意到MySQL 5.5手册说:
它也(更早在页面上)说:
由于您的声明没有“FIELDS ENCLOSED BY”和空的“FIELDS ENCLOSED BY”,因此您有固定的格式。 因此,你不能按你的意愿去做。
有时候,在数据库管理系统外面按摩数据比较容易 - 修复数据表示可能就是这样一种操作。 我确实有一个程序,我称之为DBLDFMT,我现在还没有使用过几年,但它可以执行各种操作,例如将小数转换为隐式小数点(大型机技巧;价格字段可能为0023199,代表价值£231.99)。 它也可以处理日期操作(不一定使用特别用户友好的表示法,但它能够处理我从大型机获取数据到Unix DBMS的问题 - 而不是MySQL;它在我写这个时不存在如果可能有任何兴趣,请与我联系 - 请参阅我的个人资料。
以防其他人遇到此问题。 如果你只是跑步
LOAD DATA LOCAL INFILE '<file name>' INTO TABLE <table> (@var1) SET ...
没有指定FIELDS TERMINATED BY
,并且你的文件包含逗号,默认情况下,MySQL会将其分割。
在这种情况下,你可以告诉MySQL你的字段分隔符是愚蠢的。 例如:
FIELDS TERMINATED BY '@@@@@@@@@@@@'
这样整条线就被放入第一个“列”即你的用户变量中。 然后,您可以完全按照顶部代码中所示的方式使用它。
值得注意的是,MySQL将一个字符串作为分隔符,所以你甚至可以拥有
如果你愿意,可以用FIELDS TERMINATED BY 'this_string_thoes_not_appear_in_my_file