更新时间: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官方文档说明。其他参数的先后顺序不能乱,顺序参考官方说明
  1. 数据导入阶段会在一定程度上影响DDM以及RDS for MySQL实例性能,请选择在业务空闲时间导入。
  2. 建议不要同时发起多个LOAD DATA请求。多个LOAD DATA同时进行,数据高并发写入,表锁竞争以及系统IO抢占会影响总体效率,可能会出现SQL事务超时现象,导致LOAD DATA全部失败。
  3. 由于分布式事务的特性,使用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子句