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 и аналогичные инструменты.

Не могли бы вы мне помочь? :) Большое спасибо.

РЕДАКТИРОВАТЬ:

Кажется, проблема возникает из-за СТРОКИ, ЗАКОНЧЕННОЙ НА '', поскольку такая строка является «фиксированной строкой (не ограничена)». Может быть, его нельзя присвоить переменной по неизвестной причине, но так оно и работает. В документации говорится:

Пользовательские переменные нельзя использовать, когда загрузка данных в формате фиксированной строки поскольку пользовательские переменные не имеют ширина дисплея.

Есть предложения?

ПОВТОРНОЕ РЕДАКТИРОВАНИЕ: Я прочитал комментарий Райана Нива внизу этой страницы. Он дает уловку для преобразования фиксированной строки в переменные:

LOAD DATA LOCAL INFILE '' INTO 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);

Как вы думаете, это хороший способ сделать это? :)

7
задан Markon 23 November 2010 в 18:35
поделиться