mysql的LOAD语句是专门用于快速从外部文件批量导入数据到数据库表的功能,相比多条INSERT语句循环执行,它的执行效率可以提升数倍甚至数十倍,非常适合处理千万级以内的数据批量录入需求。

LOAD语句基本语法
LOAD语句的核心语法结构如下,可根据实际场景调整参数:
LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_path'
INTO TABLE table_name
[CHARACTER SET charset_name]
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(column1, column2, ...)]
常用参数说明
- LOCAL:添加该参数表示从客户端本地读取文件,不添加则从mysql服务端所在机器的路径读取文件。
- CHARACTER SET:指定文件的字符编码,避免中文等字符出现乱码,常用值有utf8、gbk等。
- FIELDS TERMINATED BY:指定字段之间的分隔符,比如CSV文件常用逗号分隔,可设置为','。
- LINES TERMINATED BY:指定行之间的分隔符,Windows系统文本文件常用'rn',Linux系统常用'n'。
- IGNORE number LINES:忽略文件开头的指定行数,通常用于跳过表头行。
不同格式文件导入示例
导入CSV格式文件
假设有一个用户表user,结构如下:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100)
);
本地有一个user_data.csv文件,内容如下,第一行为表头:
name,age,email 张三,25,zhangsan@ipipp.com 李四,30,lisi@ipipp.com 王五,28,wangwu@ipipp.com
执行以下语句即可完成批量导入:
LOAD DATA LOCAL INFILE '/tmp/user_data.csv' INTO TABLE user CHARACTER SET utf8 FIELDS TERMINATED BY ',' LINES TERMINATED BY 'n' IGNORE 1 LINES (name, age, email);
导入TXT格式文件
如果有一个user_data.txt文件,字段用制表符分隔,行用换行分隔,无表头,内容如下:
张三 25 zhangsan@ipipp.com 李四 30 lisi@ipipp.com 王五 28 wangwu@ipipp.com
对应的导入语句为:
LOAD DATA LOCAL INFILE '/tmp/user_data.txt' INTO TABLE user CHARACTER SET utf8 FIELDS TERMINATED BY 't' LINES TERMINATED BY 'n' (name, age, email);
常见问题及解决办法
权限不足问题
如果执行语句时提示没有FILE权限,需要给当前mysql用户授予FILE权限:
GRANT FILE ON *.* TO 'your_user'@'localhost'; FLUSH PRIVILEGES;
字符乱码问题
出现乱码时首先检查文件的真实编码,然后在LOAD语句中通过CHARACTER SET参数指定对应编码,比如文件是GBK编码就设置为CHARACTER SET gbk。
字段对应错误问题
如果文件字段顺序和表字段顺序不一致,可以在语句末尾显式指定列名映射,如上述示例中的(name, age, email),确保文件字段和指定的列名顺序一一对应。
注意事项
- 执行LOAD语句的用户需要对目标表有INSERT权限。
- 如果表中存在自增主键,导入时可以不为该列赋值,mysql会自动生成自增值。
- 大文件导入时建议先关闭表的索引,导入完成后再重建索引,可进一步提升导入效率。
- LOCAL参数开启时,文件从客户端读取,服务端需要开启local_infile配置,可通过执行
SET GLOBAL local_infile = ON;开启。