MySQL 加载数据 Infile - 导致错误 1265 : Data Truncated 的空值

标签 mysql csv mysql-workbench load-data-infile

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

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

问题源于第 237 行的 DIP20 列是 csv 文件中的第一个空条目,但我的研究表明空条目应该被 MySQL 读取为 0。这会阻止整个导入运行,并且没有数据进入我的表。我一直在尝试找到一种方法来指示 MySQL 接受 Null,但一直找不到任何东西。

我在该领域注意到的其他线程建议修改源数据以将“\N”放入每个空值中,但由于几个原因,这确实不切实际。首先,我有大量的数据要处理,其次,当我完成开发后,我必须将这个数据库留给其他人,当收到更多数据时,他们没有人有时间、能力或意愿编辑数据 future 。

如果有人可以建议一种方法来运行此导入而不落入空值,我将非常感激。

我尝试运行的代码是:

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。

提前致谢

汤姆

最佳答案

我非常喜欢先将数据加载到临时表中,然后在数据库中进行类型转换。

也就是说,创建一个具有所有相同字段但定义为 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;

关于MySQL 加载数据 Infile - 导致错误 1265 : Data Truncated 的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18848639/

相关文章:

mysql - SUM() 在 LEFT JOIN 的所有行上?

Mysql 选择并计算具有多个相同值的行

python - 在 Python 中将 CSV 转换为 UTF-8

mongodb - 从 csv 导入数据时如何更改 mongodb 中自动生成的 _id 字段?

mysql - 如何获取每个组 concat 字段的总数?

mysql - 如何从sql语句中选择准确的值

csv - 如何在 CSV 中指定关系类型?

php - PhpStorm中如何设置SSH代理用户连接MySQL?

python - InternalError : (1366, u“整数值不正确:选择)错误

mysql - 数据类型为 FLOAT 的字段中的额外零