我在将数据从csv导入mysql表时遇到问题。我试图使用“加载数据填充”,但每次尝试运行我的代码时"Error Code: 1265. Data Truncated for column 'DIP20' at row 237"
这个问题源于这样一个事实:第237行的列dip20是csv文件中的第一个空条目,但是我的研究表明,mysql应该将空条目读取为0s。这将停止运行整个导入,并且没有数据进入我的表。我一直在试图找到一种方法来指示mysql接受空值,但是没有找到任何东西。
我在这方面注意到的其他线程建议对源数据进行修改,以将“\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中开发dbs,但目前在一家资金有限的非盈利组织工作,因此我被要求与mysql一起工作。我以为在碰到这个问题之前我过得很好。我使用的是mysql 5.6.13和mysql workbench 6.0。
提前谢谢
汤姆
最佳答案:
我非常喜欢先将数据加载到临时表中,然后在数据库中进行类型转换。
也就是说,创建一个具有所有相同字段但定义为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;