我在将数据从csv导入MySQL表时遇到问题。我试图使用"加载数据Infile"但每次我尝试运行我的代码时都会得到
"Error Code: 1265. Data Truncated for column 'DIP20' at row 237"
问题源于第237行的DIP20列是csv文件中的第一个空条目这一事实,但我的研究表明MySQL应将空条目读为0。这样就会停止整个导入运行,没有数据进入我的表。我一直试图找到一种方法来指示MySQL接受Null但却找不到任何东西。
我在这方面已经注意到的其他线程建议要求源数据放置一个' \ N'进入每一个零点,但由于几个原因,这实际上并不实用。首先,我要处理一些Terrabytes数据,其次,当我完成开发时,我必须将这个数据库留给其他人,当收到更多数据时,他们都没有时间,能力或倾向于编辑数据未来。
如果有人可以建议一种方法来让这个导入运行而不会落在空值上,我将非常感激。
我试图运行的代码是:
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 workbench 6.0。
提前致谢
汤姆
答案 0 :(得分:2)
我非常喜欢先将数据加载到临时表中,然后在数据库中进行类型转换。
也就是说,创建一个具有所有相同字段的临时表,但定义为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;