Mysql LOAD DATA INFILE - 输入数据意外截断

时间:2012-07-10 12:11:35

标签: mysql load etl mysqlimport

我正在尝试将数据加载到表格中(很明显?)。我的表看起来像这样:

CREATE TABLE IF NOT EXISTS `condensed` (
  `id` bigint(20) NOT NULL,
  `src` enum('C_X','C_AH','C_AO','C_B','H_X','H_AH','H_AO','H_B') NOT NULL,
  `hash` int(11) default NULL,
  `ihash` int(11) default NULL,
  `last_updated` datetime default NULL,
  PRIMARY KEY  (`id`,`src`),
  UNIQUE KEY `covering` (`id`,`src`,`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=ascii;

我的数据文件看起来像这样:

320115816,'C_X',692983698,854142703,20120216220954
320124536,'C_X',588472049,1059436251,20100527232845
320120196,'C_X',452117509,855369958,20101118105505
...

但是当我使用

加载它时
LOAD DATA INFILE '/path/to/data.csv' 
IGNORE
INTO TABLE `condensed` 
(id, src, hash, ihash, last_updated);

它只加载前两列(hash,ihash和last_updated为null)。

320115816,'C_X',NULL,NULL,NULL
320124536,'C_X',NULL,NULL,NULL
320120196,'C_X',NULL,NULL,NULL
...

我收到了很多警告(大概是因为mysql丢弃了输入集中的3列并分配了默认值)

Query OK, 20 rows affected, 100 warnings (0.00 sec)
Records: 20  Deleted: 0  Skipped: 0  Warnings: 100

(我打算加载数百个记录 - 而不仅仅是20个)

我使用mysqlimport得到同样的问题。

从LOAD DATA语句中省略显式字段列表(数据库中的文件和顺序与文件中相同)会产生相同的结果。

MySQL版本为5.0.22,输入文件中没有不可打印的字符。

帮助!

5 个答案:

答案 0 :(得分:1)

如果您使用的是Windows,请在Thilo的答案中添加一些改进。

LOAD DATA INFILE '/path/to/data.csv' IGNORE 
INTO TABLE `condensed` 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\''
LINES TERMINATED BY '\r\n' --Windows right line terminator
(id, src, hash, ihash, last_updated)

它对我有用。它解决了我在Windows上的所有截断问题。还看看这个: http://forums.mysql.com/read.php?79,76131,76871

答案 1 :(得分:1)

从未设法解决此问题。我最后编写了一个php脚本来将数据映射到db。

答案 2 :(得分:1)

值得注意的是,如果MySQL抱怨的字段恰好是表中的最后一个字段,那么您有可能需要修复FIELDS TERMINATED BY。在Windows上我必须告诉它\ n而不是\ r \ n。

答案 3 :(得分:1)

我在IBM大型机上创建的CSV文件遇到类似问题,该大型机在加载之前已移至Windows文件服务器。我在除了最后一行之外的所有行上都收到了截断警告。大型机文件看起来没问题。添加'\ r \ n'可以解决问题。

答案 4 :(得分:0)

我认为只有枚举字段的引号会混淆导入。试试这个:

LOAD DATA INFILE '/path/to/data.csv' IGNORE 
INTO TABLE `condensed` 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\''
(id, src, hash, ihash, last_updated)