MySQL:如何将具有固定行格式的数据加载到用户变量中

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)

你认为这是一个很好的方法吗?:)

Jon*_*ler 4

我不是专家,但在我看来,如果字段以空字符串终止,那么它们必须是固定大小的;必须有某种方法来确定字段之间的边界,如果没有终止符,那么它们几乎必须是固定大小的。

\n\n

我观察到MySQL 5.5手册说:

\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
\n
\n\n

由于您的语句没有“FIELDS ENCLOSED BY”且为空“FIELDS ENCLOSED BY”,这就是您采用固定格式的原因。因此你不能做你想做的事。

\n\n
\n\n

有时,在 DBMS 外部处理数据更容易 - 修复数据表示可能就是这样的操作之一。我确实有一个名为 DBLDFMT 的程序,我已经好几年没有使用它了,但它可以执行各种操作,例如使用隐式小数点转换十进制数(大型机技巧;价格字段可能是 0023199 ,代表值 \xc2\xa3231.99)。它也可以处理日期操作(不一定使用特别用户友好的符号,但它能够处理我从大型机获取数据到 Unix DBMS 时遇到的问题 - 不是 MySQL;当我编写时它不存在此代码。如果您对此感兴趣,请联系我 - 请参阅我的个人资料。

\n