MYSQL-LOAD DATA 0row问题解决

原创 2015年11月20日 16:54:56
问题描述:LOAD DATA 运行正常,但是返回 Query OK,0 ROWS affected...

MYSQL 数据库在本地WINDOWS里,运行LOAD DATA的时候没有报错,但是每次提示如下:


数据是在CSV文件里的,大概是几十万到几百万左右。内容格式如下:



试过:
1.加了LOCAL关键字
2.将file_name和created_year两个字段和SET语句删掉
3.删掉创建的分区代码
4.由于file_name和created_year两个字段是人为生成的,所以加入数据文件里的字段还是没有装载成功
5.尝试在另一台机器上建表,然后远程过去装载(加入LOCAL)还是一样
。。。


建表语句以及LOAD DATA语句:

create table tb_wx_fucn_sn_y
(
  product_code             varchar(32)   
 ,serial_number            varchar(32)   
 ,carton_barcode           varchar(32)   
 ,manufacture_time         varchar(32)   
 ,product_type             varchar(64)  default 'a'  
 ,product_desc             varchar(256)  
 ,file_name                varchar(128)  
 ,created_year             tinyint       
) engine=innodb default charset=utf8 comment='abc'
partition by list(created_year)
(  
  partition tp_2011 values in (2011)
 ,partition tp_2012 values in (2012)
 ,partition tp_2013 values in (2013)
 ,partition tp_2014 values in (2014)
 ,partition tp_2015 values in (2015)
 ,partition tp_2016 values in (2016)
)  ;


LOAD DATA INFILE 'E:\\tmp\\mw_20110701-20110831.csv'
INTO TABLE tb_wx_fucn_sn_y
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES 
(
  product_code    
 ,serial_number   
 ,carton_barcode  
 ,manufacture_time
 ,product_type    
 ,product_desc    
)
SET  file_name    = 'mw_20110701-20110831.csv'
    ,created_year = cast(substr(manufacture_time,1,4) as signed) 
;

尝试了两个多小时后,修改了搜索的关键字为“load data 0 row”,参考以下两个网页

http://stackoverflow.com/questions/10662558/load-data-infile-for-huge-file-no-warning-no-error-and-no-rows-affected

http://stackoverflow.com/questions/10935219/mysql-load-data-infile-works-but-unpredictable-line-terminator

LINES TERMINATED BY '\r\n' 修改为 LINES TERMINATED BY '\n' 装载成功。

但问题又来了,我之前也怀疑过可能是行结束符的问题,我还特意的通过UE来查看:


每一行都是以“OD OA”结束的,所以我才没有修改行结束符。

网上也说是装载几十万到几百万行数据的时候出现这个问题。不知是否MYSQL的一个BUG。


----------------------------------------分隔线----------------------------------------------------------------------------------------------------------------------------------------------------- 

下午LINES TERMINATED BY '\r\n' 修改为 LINES TERMINATED BY '\n'  


问题并没有解决,而是产生了另外的问题,代码为1262,只有部分的数据插入到表中。上网查了下这个错误代码,

有人说是配置问题。后面不知道看到那个答案说可能是字符集的问题,问题变得越来越复杂。

也是将character_set_database 从utf-8修改成gbk后,我发现LINES TERMINATED BY '\r\n'可能装载成功

但是,中文就变成了乱码,因为原来的源文件是UTF-8格式的。在一筹莫展的时候,我想起了

http://stackoverflow.com/questions/10935219/mysql-load-data-infile-works-but-unpredictable-line-terminator

里面的一种方法,将'\r'去掉。于是尝试着这样。代码如下:

LOAD DATA INFILE 'E:\\tmp\\mw_20110701-20110831.csv'
INTO TABLE tb_wx_fucn_sn_y
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES 
(
  product_code    
 ,serial_number   
 ,carton_barcode  
 ,manufacture_time
 ,product_type    
 ,@var 
)
SET  product_type = 'a'
    ,file_name    = 'mw_20150301-20150315.csv'
    ,product_desc = trim(trailing '\r' from @var)
    ,created_year = cast(substr(manufacture_time,1,4) as signed) 
;

然后,数据可以全部导进去,但是还是报了1262这个错误。目前才疏学浅,这只能留到以后再去解决了。毕竟这个问题已经

困扰了我整整一个下午,各种目前能想到的都试过,我怀疑还是由于是字符集的问题。或者只能吐槽下WINDOWS平台。。。


------------------------------------------------再次分隔线(20151121)-----------------------------------------------------------------------------

昨天出现1262这个错误后,以为没有对结果造成影响。但是,后来发现,其实数据是有受到影响的。如下图右边红框处的数据是多出来的。

我怀疑是由于修改了行结束符,导致串行了,即第二行的走到第一行来,然后由于字段定义的问题被截断了。



下图是本地数据库的字符集信息:


然后,数据文件的字符集也是UTF-8的,以前使用LOAD DATA INFILE的时候都没有问题


如果将数据文件转成GBK,装载的时候就报了1366这个错误,并且导致中文件信息丢失


如下图红框处,本来英文字符后还有一些中文字符的,但是就丢失了。



刚才无意(确实是不知道脑子里想到的是什么,忘记了为什么这样做), 将转义字符(")修改成(\),然后,。。。

神奇的事情发生了,居然没有装载成功了。那个兴奋感,一个”操“字随口而出,简直是。。。。

从昨天中午开始,困扰我到今天,差不多一天时间,十几个小时,差点将我的脑袋想炸了。。。

总结:

由于转义字符的书写错误(ESCAPED BY '"'),导致了装载的失败,但是又没有报错,所以无法定位到问题。

因为之前没有怎么用到转义字符,而且,之前那样书写也可以装载成功,所以导致我没有关注到问题会出现在那个地方。

将转义字符修改成反斜杠(ESCAPED BY '\\')后,问题解决。


MySQL问题—中文写入数据库乱码及Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1解决

做有关微信公众账号的项目时,报Incorrect string value: '\xF0\x9F\x98\x92' for column 'NIKENAME' at row 1,而所有的字符编码都是u...

MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题以及error 1406:data too long for column 'name' at row 1

MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的。 character-set-databas...

【问题解决】MySQL5.5 向MySQL数据库中插入汉字时,提示:Incorrect string value: '\Xe7\x8E...' for column 'XXX' at row 1

MySQL5.5 向MySQL数据库中插入汉字时,提示:Incorrect string value: '\Xe7\x8E...' for column 'XXX' at row 1...

解决:MySQL Load Data数据丢失问题

MySQL 5.7 MacOS Sirrea 10.12.1前言 很简单,我得文件里面20w数据,导入MySQL后只剩下16w条数据,无Deleted无Skipped 排查方法 既然数据丢失...

[问题记录.WinDbg]WinDbg 调试遇到 Failed to load data access DLL, 0x80004005

【问题】 拿到服务人员提交的dump文件,用 DebugDiag Analysis/WinDbg 分析时提示以下信息。 WinDbg报错 Failed to load data ...

c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

解决的思路是:MySQL配置中my.cnf的wait_timeout值一定要大于等于连接池种的idle_timeout值。否则mysql会在wait_timeout的时间后关闭连接,默认的关闭连接的时...

mysql开发存储过程中,select结果集再动态的条件下select count(*)统计返回都为0问题解决

在写mysql存储过程中,遇到一个坑,一般逻辑下select结果集再动态的条件下select count(*)统计返回是能得到正确统计值。但在光标嵌套和for循环中却出现动态sql的结果集始终为0,导...

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

本文提供了对c3p0与DBCP连接池连接MySQL数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案。 ...
  • Aeroleo
  • Aeroleo
  • 2016年10月22日 22:15
  • 256

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

http://blog.csdn.net/wangfayinn/article/details/24623575 本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MYSQL-LOAD DATA 0row问题解决
举报原因:
原因补充:

(最多只允许输入30个字)