MYSQL-LOAD DATA 0row问题解决

在Windows环境下,使用LOAD DATA导入CSV数据到MySQL时遇到0行数据导入的问题。经排查,行终止符从' '改为' '后,数据部分导入并出现1262错误。进一步尝试发现,错误源于字符集和转义字符设置。通过调整字符集、去除' '和修正ESCAPED BY设置,最终解决问题。
问题描述: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/106625

### 解决 MySQLLOAD DATA LOCAL INFILE 的常见错误 在使用 `LOAD DATA LOCAL INFILE` 时,可能会遇到语法错误(如 ERROR 1064)或文件访问被拒绝的错误(如 ERROR 2068)。以下是针对这些错误的详细解决方案。 #### ERROR 1064 (42000): SQL 语法错误 此错误通常表示 SQL 语句中存在语法问题。以下是一些可能的原因及解决方法: - **关键字拼写错误**:确保使用了正确的关键字 `LOCAL` 和 `INFILE`,并且它们之间没有多余的空格或字符。 - **路径格式问题**:在 Windows 系统中,文件路径中的反斜杠 `\` 需要转义为双反斜杠 `\\`[^3]。 - **缺少必要的子句**:如果未指定字段分隔符(`FIELDS TERMINATED BY`)或行结束符(`LINES TERMINATED BY`),可能会导致语法错误。例如: ```sql LOAD DATA LOCAL INFILE 'D:\\employee.txt' INTO TABLE employee FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; ``` #### ERROR 2068 (HY000): 文件访问被拒绝 此错误通常与 `LOCAL INFILE` 的权限设置有关。以下是解决方案: - **启用 `local_infile` 参数**:确保服务器和客户端都允许 `LOCAL INFILE` 操作。可以通过以下命令检查当前配置: ```sql SHOW VARIABLES LIKE 'local_infile'; ``` 如果返回值为 `OFF`,需要将其设置为 `ON`。可以通过修改 `my.cnf` 或 `my.ini` 文件来实现: ```ini [mysqld] local-infile=1 ``` 然后重启 MySQL 服务以使更改生效[^5]。此外,在客户端连接时也需要显式启用 `LOCAL INFILE` 支持,例如: ```bash mysql --local-infile=1 -u 用户名 -p ``` - **文件权限问题**:确保 MySQL 服务有权限访问指定的文件路径。如果文件位于 Windows 系统的驱动器根目录下(如 `D:\`),需要确认 MySQL 进程有足够的权限读取该文件。 #### 安全限制:`secure_file_priv` 参数 如果服务器启用了 `--secure-file-priv` 选项,可能会限制文件的导入导出操作。可以通过以下命令查看当前设置: ```sql SHOW VARIABLES LIKE 'secure_file_priv'; ``` 如果返回值不为空,则表示文件必须位于指定的目录下才能被导入或导出。可以修改 `secure_file_priv` 参数以解除限制,但需要注意安全性问题[^2]。 #### 示例代码 以下是一个完整的示例,假设文件 `D:\\employee.txt` 中的数据以逗号分隔,并以换行符结束: ```sql LOAD DATA LOCAL INFILE 'D:\\employee.txt' INTO TABLE employee FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; ``` #### 注意事项 - 如果仍然出现错误,可以尝试将 `LOCAL` 关键字移除,改为直接在服务器上操作文件。但需确保文件位于服务器可访问的路径下[^4]。 - 在加载数据时,确保文件内容与目标表的字段定义相匹配。如果文件中的列数与表中的列数不一致,可以使用 `IGNORE` 或 `SET` 子句进行处理[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值