插件窝 干货文章 JDBC 连接 MySQL 时,如何解决 LOAD DATA 命令失效问题?

JDBC 连接 MySQL 时,如何解决 LOAD DATA 命令失效问题?

MySQL 文件 FILE String 436    来源:    2025-03-30

解决 JDBC 连接 MySQL 时 LOAD DATA 命令失效问题

当使用 JDBC 连接 MySQL 并执行 LOAD DATA 命令时,可能会遇到命令不执行或失效的情况。以下是常见原因及解决方案:

常见原因

  1. 文件路径问题:JDBC 默认从服务器端读取文件,而非客户端
  2. 权限不足:MySQL 用户缺少 FILE 权限
  3. 安全限制:MySQL 服务器配置限制
  4. 字符集问题:文件与数据库字符集不匹配
  5. JDBC 驱动版本问题

解决方案

1. 使用 LOCAL 关键字

String sql = "LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE table_name";

添加 LOCAL 关键字让 MySQL 从客户端读取文件,而非服务器端。

2. 设置 JDBC 连接参数

在连接字符串中添加允许本地文件加载的参数:

String url = "jdbc:mysql://localhost/db?allowLoadLocalInfile=true";

3. 授予 FILE 权限

确保 MySQL 用户有 FILE 权限:

GRANT FILE ON *.* TO 'username'@'host';

4. 检查 MySQL 服务器配置

在 MySQL 配置文件 (my.cnf/my.ini) 中确保以下设置:

[mysqld]
local_infile=1

5. 使用 PreparedStatement 替代

String sql = "LOAD DATA LOCAL INFILE ? INTO TABLE table_name";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "/path/to/file.csv");
pstmt.execute();

6. 完整示例代码

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();
        }
    }
}

注意事项

  1. 确保文件路径正确且应用程序有读取权限
  2. 对于 Windows 路径,使用双反斜杠或正斜杠:C:\\path\\to\\file.csvC:/path/to/file.csv
  3. 考虑使用 REPLACEIGNORE 选项处理重复键
  4. 大文件加载可能需要调整 MySQL 的 max_allowed_packet 参数

如果问题仍然存在,可以尝试使用 MySQL 的 mysqlimport 工具或编写程序逐行读取文件并使用 INSERT 语句。