MySQL Load Data Infile — нули, вызывающие ошибку 1265: Data Truncated

У меня проблема с импортом данных из csv в таблицу MySQL. Я пытаюсь использовать «Загрузить файл данных», но каждый раз, когда я пытаюсь запустить свой код, я получаю

"Error Code: 1265. Data Truncated for column 'DIP20' at row 237"

Проблема связана с тем, что столбец DIP20 в строке 237 является первой нулевой записью в CSV-файле, но мои исследования показывают, что нулевые записи должны считываться MySQL как 0. Это останавливает запуск всего импорта, и данные не попадают в мою таблицу. Я пытался найти способ заставить MySQL принимать значения Null, но ничего не нашел.

Другие потоки, которые я заметил в этой области, предлагали изменить исходные данные, чтобы поместить '\N' в каждый нуль, но это действительно нецелесообразно по нескольким причинам. Во-первых, у меня есть несколько террабайт данных для обработки, а во-вторых, я должен оставить эту базу данных другим людям, когда я закончу ее разработку, и ни у кого из них не будет времени, возможности или желания редактировать данные, когда будет получено больше данных. будущее.

Если бы кто-нибудь мог предложить способ запустить этот импорт, не падая на нули, я был бы очень признателен.

Код, который я пытаюсь запустить:

LOAD DATA INFILE '\\\\server\\path\\morepath\\file.csv'
INTO TABLE deidata.tbl_HHDataImport
FIELDS TERMINATED BY ',' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n' STARTING BY ''
IGNORE 1 LINES

Структура таблицы следующая:

table tbl_HHDataImport
(
CNF_ID  VARCHAR(10)  PRIMARY KEY,
Read_date  Datetime,
DIP1 float,
DIP2 float,
//...{48 DIP columns here}...
DIP47 float,
DIP48 float 
)

(Это должна быть промежуточная таблица, из которой я буду преобразовывать данные в правильную реляционную структуру. Это формат данных, которые я получаю, и я не могу его изменить.)

Я привык разрабатывать базы данных в MS SQL Server, но в настоящее время я работаю в некоммерческой организации с небольшим дефицитом средств, поэтому меня попросили поработать с MySQL. Я думал, что справляюсь с этим, пока не столкнулся с этой проблемой. Я использую MySQL 5.6.13 и рабочее место MySQL 6.0.

заранее спасибо

Том


person Smoggie Tom    schedule 17.09.2013    source источник
comment
эта ошибка обычно возникает, когда ввод длиннее, чем поле может принять, убедитесь, что в таблицу попадает что-то еще.   -  person johnny    schedule 17.09.2013


Ответы (1)


Я большой поклонник загрузки данных сначала в промежуточные таблицы, а затем выполнения преобразований типов в базе данных.

То есть создайте промежуточную таблицу со всеми теми же полями, но определенными как varchar(255) или nvarchar(255) (в зависимости от содержимого CSV-файла).

Это должно загружаться правильно, без ошибок преобразования типов.

Затем сделайте что-то вроде:

insert into tbl_HHDataImport(Read_Date, DIP1,  . . . )
    select now(), cast(DIP1 as float), . . . 
    from tbl_HHDataImport_staging;

Если у вас есть проблема с конверсией, вы легко сможете ее определить. Я предполагаю, что код должен быть таким:

insert into tbl_HHDataImport(Read_Date, DIP1,  . . . )
    select now(),
           (case when DIP1 <> 'NULL' then cast(DIP1 as float) end), . . . 
    from tbl_HHDataImport_staging;
person Gordon Linoff    schedule 17.09.2013
comment
С этим разобрались, спасибо. Я преобразовал все поля промежуточной таблицы в varchars, и импорт прошел нормально. Преобразование типов теперь должно быть простым делом! Кажется, MySQL не любит импортировать нули как числовой тип. - person Smoggie Tom; 17.09.2013