更新时间:2022-02-22 GMT+08:00
LOAD DATA
标准示例
LOAD DATA LOCAL INFILE '/data/qq.txt' IGNORE INTO TABLE test CHARACTER SET 'gbk' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'(id,sid,asf)
如果数据中可能包含一些特殊字符,比如分割符转义符等,建议用引号扩起来,通过OPTIONALLY ENCLOSED BY '"'指定。
如果上述方法不起作用,可以把字段值中的引号替换成\"。
- 如果指定LOCAL关键词,则表明从客户端主机读文件。如果local没指定,出于安全考虑不支持此功能。
- 可以通过FIELDS TERMINATED BY指定字符之间的分割符号,默认值为\t 。
- 通过OPTIONALLY ENCLOSED BY忽略数据源字段中的符号。
- 通过LINES TERMINATED BY可以指定行之间的换行符,默认为\n。
有些windows上的文本文件的换行符可能为\r\n,由于是不可见字符,所以请小心检查。
- 通过CHARACTER SET指定文件的编码,建议跟RDS for MySQL实例上物理库(分片)的编码一致,否则可能乱码。其中字符集编码必须用引号扩起来,否则会解析出错。
- 通过IGNORE或者REPLACE指定遇到重复记录是替换还是忽略。
- 目前列名必须指定,且必须包括分片字段,否则没办法确定路由。
- 其他参数参考MySQL的load data infile官方文档说明。其他参数的先后顺序不能乱,顺序参考官方说明。
- 数据导入阶段会在一定程度上影响DDM以及RDS for MySQL实例性能,请选择在业务空闲时间导入。
- 建议不要同时发起多个LOAD DATA请求。多个LOAD DATA同时进行,数据高并发写入,表锁竞争以及系统IO抢占会影响总体效率,可能会出现SQL事务超时现象,导致LOAD DATA全部失败。
- 由于分布式事务的特性,使用LOAD DATA导入数据时,需要设置手动提交事务,以确保数据记录改动的准确无误。
mysql> set autocommit=0;
mysql> LOAD DATA LOCAL INFILE '/data/qq.txt' IGNORE INTO TABLE test CHARACTER SET 'gbk' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'(id,sid,asf);
mysql> commit;
限制
不支持:
- [IGNORE number {LINES | ROWS}]子句
- SET子句
父主题: 实用SQL语句