当使用 JDBC 连接 MySQL 并执行 LOAD DATA
命令时,可能会遇到命令不执行或失效的情况。以下是常见原因及解决方案:
String sql = "LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE table_name";
添加 LOCAL
关键字让 MySQL 从客户端读取文件,而非服务器端。
在连接字符串中添加允许本地文件加载的参数:
String url = "jdbc:mysql://localhost/db?allowLoadLocalInfile=true";
确保 MySQL 用户有 FILE 权限:
GRANT FILE ON *.* TO 'username'@'host';
在 MySQL 配置文件 (my.cnf/my.ini) 中确保以下设置:
[mysqld]
local_infile=1
String sql = "LOAD DATA LOCAL INFILE ? INTO TABLE table_name";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "/path/to/file.csv");
pstmt.execute();
import java.sql.*;
public class LoadDataExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost/db?allowLoadLocalInfile=true";
String user = "username";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "LOAD DATA LOCAL INFILE '/path/to/file.csv' " +
"INTO TABLE my_table " +
"FIELDS TERMINATED BY ',' " +
"LINES TERMINATED BY '\\n' " +
"IGNORE 1 LINES";
Statement stmt = conn.createStatement();
stmt.execute(sql);
System.out.println("Data loaded successfully");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
C:\\path\\to\\file.csv
或 C:/path/to/file.csv
REPLACE
或 IGNORE
选项处理重复键max_allowed_packet
参数如果问题仍然存在,可以尝试使用 MySQL 的 mysqlimport
工具或编写程序逐行读取文件并使用 INSERT 语句。