-- 检查用户权限
SHOW GRANTS FOR CURRENT_USER;
-- 授予 FILE 权限
GRANT FILE ON *.* TO 'username'@'host';
// 使用 LOCAL 关键字从客户端加载文件
String query = "LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE table_name FIELDS TERMINATED BY ','";
// 或者使用服务器路径(需要文件在服务器上)
String query = "LOAD DATA INFILE '/var/lib/mysql-files/file.csv' INTO TABLE table_name";
在连接字符串中添加允许 LOAD DATA LOCAL 的参数:
String url = "jdbc:mysql://localhost/db?allowLoadLocalInfile=true";
如果 LOAD DATA 仍然无法工作,可以考虑:
// 方法1: 使用批量插入
PreparedStatement ps = conn.prepareStatement("INSERT INTO table_name VALUES (?, ?, ?)");
// 读取文件并逐行设置参数
ps.addBatch();
ps.executeBatch();
// 方法2: 使用 Apache Commons CSV 或其他库解析文件后插入
确保 MySQL 配置文件(my.cnf/my.ini)中有以下设置:
[mysqld]
local_infile = ON
[client]
local_infile = ON
try {
// 设置允许本地文件加载
String url = "jdbc:mysql://localhost/test?allowLoadLocalInfile=true";
Connection conn = DriverManager.getConnection(url, "user", "password");
// 执行LOAD DATA命令
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(
"LOAD DATA LOCAL INFILE '/path/to/data.csv' " +
"INTO TABLE my_table " +
"FIELDS TERMINATED BY ',' " +
"LINES TERMINATED BY '\\n'");
System.out.println("Loaded " + result + " rows");
} catch (SQLException e) {
e.printStackTrace();
}
如果问题仍然存在,请检查MySQL错误日志获取更详细的错误信息。