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 TERMINATED BY和FIELDS ENCLOSED BY值都为空(''),则使用固定行(非限制)格式。 使用固定行格式,字段之间不使用分隔符(但仍可以有行终止符)。 而是使用足够宽的字段来读取和写入列值,以保存字段中的所有值。 对于TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT,无论声明的显示宽度是多少,字段宽度分别为4,6,8,11和20。
  • 由于您的声明没有“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

    链接地址: http://www.djcxy.com/p/49001.html

    上一篇: MySQL : how to load data with fixed

    下一篇: Resolving .NET assembly reference to a different name?