Mar*_*kon 7 mysql sql database
我正在尝试加载一个文件,其中所有行都使用相同的规则.(假设HEADER是单行)
HEADER1
HEADER2
.......
Run Code Online (Sandbox Code Playgroud)
但不幸的是,当我尝试使用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');
Run Code Online (Sandbox Code Playgroud)
我有这个想法阅读本页的底部(由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);
Run Code Online (Sandbox Code Playgroud)
你认为这是一个很好的方法吗?:)
我不是专家,但在我看来,如果字段以空字符串终止,那么它们必须是固定大小的;必须有某种方法来确定字段之间的边界,如果没有终止符,那么它们几乎必须是固定大小的。
\n\n我观察到MySQL 5.5手册说:
\n\n\n\n\n\n
\n- 加载固定行格式的数据时不能使用用户变量,因为用户变量没有显示宽度。
\n
它还(在页面的前面)说:
\n\n\n\n\n\n
\n- 如果“FIELDS TERMINATED BY”和“FIELDS ENCLOSED BY”值均为空 (\'\'),则使用固定行(非分隔)格式。使用固定行格式,字段之间不使用分隔符(但您仍然可以使用行终止符)。相反,使用足够宽的字段宽度来读取和写入列值,以容纳字段中的所有值。对于 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT,无论声明的显示宽度是多少,字段宽度分别为 4、6、8、11 和 20。
\n
由于您的语句没有“FIELDS ENCLOSED BY”且为空“FIELDS ENCLOSED BY”,这就是您采用固定格式的原因。因此你不能做你想做的事。
\n\n有时,在 DBMS 外部处理数据更容易 - 修复数据表示可能就是这样的操作之一。我确实有一个名为 DBLDFMT 的程序,我已经好几年没有使用它了,但它可以执行各种操作,例如使用隐式小数点转换十进制数(大型机技巧;价格字段可能是 0023199 ,代表值 \xc2\xa3231.99)。它也可以处理日期操作(不一定使用特别用户友好的符号,但它能够处理我从大型机获取数据到 Unix DBMS 时遇到的问题 - 不是 MySQL;当我编写时它不存在此代码。如果您对此感兴趣,请联系我 - 请参阅我的个人资料。
\n| 归档时间: |
|
| 查看次数: |
4488 次 |
| 最近记录: |