当你在使用 JDBC 连接 MySQL 并执行 LOAD DATA
命令时遇到 "命令不允许" 错误(通常显示为 "The used command is not allowed with this MySQL version"),这通常是由于安全限制导致的。以下是几种解决方案:
MySQL 出于安全考虑,默认禁止通过 JDBC 直接执行 LOAD DATA
命令,以防止潜在的安全风险。
String url = "jdbc:mysql://localhost:3306/your_database?allowLoadLocalInfile=true";
Connection conn = DriverManager.getConnection(url, username, password);
local_infile=1
如果你能控制 MySQL 启动方式,可以添加:
--local-infile=1
如果以上方法不可行,可以考虑:
使用 LOAD DATA LOCAL INFILE
代替 LOAD DATA INFILE
Statement stmt = conn.createStatement();
stmt.execute("LOAD DATA LOCAL INFILE '/path/to/file' INTO TABLE your_table");
使用批量插入替代:
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO your_table VALUES (?, ?, ?)");
// 读取文件并逐行设置参数
pstmt.addBatch();
pstmt.executeBatch();
LOAD DATA LOCAL
存在安全风险,因为它允许客户端读取服务器上的任意文件try {
String url = "jdbc:mysql://localhost:3306/your_db?allowLoadLocalInfile=true";
Connection conn = DriverManager.getConnection(url, "user", "password");
Statement stmt = conn.createStatement();
stmt.execute("LOAD DATA LOCAL INFILE '/path/to/file.csv' " +
"INTO TABLE your_table " +
"FIELDS TERMINATED BY ',' " +
"LINES TERMINATED BY '\\n'");
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
希望这些解决方案能帮助你解决问题!如果仍有疑问,可以提供更详细的错误信息以便进一步分析。