MySQL Load Data Infile - Nulls 导致错误 1265:数据被截断

Posted

技术标签:

【中文标题】MySQL Load Data Infile - Nulls 导致错误 1265:数据被截断【英文标题】:MySQL Load Data Infile - Nulls causing error 1265: Data Truncated 【发布时间】:2013-09-21 19:41:07 【问题描述】:

我在将数据从 csv 导入 mysql 表时遇到问题。我正在尝试使用“加载数据文件”,但每次我尝试运行我的代码时,我都会得到 ​​p>

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

问题源于第 237 行的 DIP20 列是 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 Workbench 6.0。

提前致谢

汤姆

【问题讨论】:

这个错误通常出现在输入的长度超过字段可以接受的情况下,请确保有其他内容进入表中。 【参考方案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;

【讨论】:

这样排序了,谢谢。我将临时表中的所有字段都变成了 varchars,并且导入很顺利。类型转换现在应该是小菜一碟了!似乎 MySQL 不喜欢将空值作为数字类型导入。

以上是关于MySQL Load Data Infile - Nulls 导致错误 1265:数据被截断的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:启用 LOAD DATA LOCAL INFILE

MySQL通过 LOAD DATA INFILE 批量导入数据

MySql LOAD DATA INFILE 以逗号失败

mysql load data local infile问题

MySQL 之 LOAD DATA INFILE 快速导入数据

LOAD DATA LOCAL INFILE 在 MySQL 中只导入一行