MySQL:如何将固定行格式的数据加载到用户变量中
我试图加载一个文件,所有行都使用相同的规则。 (假设HEADER是单行)MySQL:如何将固定行格式的数据加载到用户变量中
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比较和类似工具。
你能帮助我吗? :) 非常感谢。
编辑:
看来问题是由TERMINATED BY“”的行中给出,因为这种线是“固定行(未定)”。也许它不能被分配给变量为一个未知的原因,但这是它的工作方式。 该文档说:
User variables cannot be used when loading data with fixed-row format because user variables do not have a display width.
任何建议?
RE-EDIT: 我已阅读该页面底部的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手册说:
- User variables cannot be used when loading data with fixed-row format because user variables do not have a display width.
它还(而更早在页面)说:
- If the FIELDS TERMINATED BY and FIELDS ENCLOSED BY values are both empty (''), a fixed-row (nondelimited) format is used. With fixed-row format, no delimiters are used between fields (but you can still have a line terminator). Instead, column values are read and written using a field width wide enough to hold all values in the field. For TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT, the field widths are 4, 6, 8, 11, and 20, respectively, no matter what the declared display width is.
由于您的语句和空'不 'ENCLOSED田野' FIELDS ENCLOSED BY',这就是为什么你有一个固定的格式。因此,你不能按你的意愿去做。
有时候,在数据库管理系统外面按摩数据比较容易 - 修复数据表示可能就是这样一种操作。我确实有一个程序,我称之为DBLDFMT,我现在还没有使用过几年,但它可以执行各种操作,例如将小数转换为隐式小数点(大型机技巧;价格字段可能为0023199,代表价值£231.99)。它也可以处理日期操作(不一定使用特别用户友好的表示法,但它能够处理我从大型机获取数据到Unix DBMS的问题 - 而不是MySQL;它在我写这个时不存在。代码与我联系,如果可能的任何利益 - 见我的个人资料
非常感谢你的回答。但是,我可以在底部阅读,我解决了这个问题。 – Markon 2010-12-06 20:51:59
万一别人遇到这种 如果只是运行
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
如果你想
在文档中提到它不会固定长度格式的数据。最好的,是重新修复你的插入文件。或者将其更改为varchar,并稍后执行类型转换。 – ajreal 2010-11-23 18:11:44
@ajreal:谢谢!昨天我没有阅读你的答案,但我编辑了我的问题,并且我写了类似于你所说的内容:) – Markon 2010-11-24 08:18:49