mysqlimport 不是一个 C 语言函数或库,而是一个独立的命令行工具,由 MySQL/MariaDB 官方提供。

您不能在 C 代码中直接调用 mysqlimport 函数,您可以在 C 程序中通过系统调用来执行 mysqlimport 命令,就像在终端里运行一样。
下面我将分两部分来解释:
mysqlimport命令行工具的详细用法:这是理解其工作原理的基础。- 如何在 C 语言程序中调用
mysqlimport:这是您问题的核心。
第一部分:mysqlimport 命令行工具详解
mysqlimport 是一个数据导入工具,它的主要作用是根据文本文件(如 CSV, TSV)的数据来填充 MySQL 数据库中的表,它的一个核心特点是:文件名(去掉扩展名)默认对应数据库名中的表名。
基本语法
mysqlimport [options] database_name textfile1 [textfile2 ...]
[options]: 各种选项,用于指定连接信息、文件格式等。database_name: 要导入数据的数据库名。textfile1,textfile2: 一个或多个文本文件,这些文件必须位于当前目录下。
常用选项
| 选项 | 全称 | 描述 |
|---|---|---|
-u |
--user |
MySQL 用户名 |
-p |
--password |
MySQL 密码(输入后会提示输入,更安全) |
-h |
--host |
MySQL 服务器主机名或 IP 地址 |
-P |
--port |
MySQL 服务器端口号 |
--local |
从客户端本地文件导入(默认行为,除非服务器配置了 secure_file_priv) |
|
--ignore-lines=N |
忽略文件开头的 N 行(通常用于跳过 CSV 文件的标题行) | |
-L |
--local-file |
与 --local 相同 |
-c |
--columns |
指定要导入的列名,用逗号分隔 |
-i |
--ignore |
遇到重复键时,忽略新行,不报错 |
-r |
--replace |
遇到重复键时,替换旧行 |
--fields-terminated-by=... |
指定字段分隔符( 或 \t) |
|
--fields-enclosed-by=... |
指定字段包围符() | |
--fields-optionally-enclosed-by=... |
指定哪些字段被包围符包围(仅用于字符串) | |
--fields-escaped-by=... |
指定转义字符(\) |
工作原理
mysqlimport 的实际工作流程是:

- 它读取一个文本文件(
mydata.csv)。 - 它会创建一个临时的 SQL
LOAD DATA INFILE语句。 - 这个语句的目标数据库是
database_name,目标表名是mydata(即文件名去掉.csv扩展名)。 - 然后它执行这个
LOAD DATA INFILE语句将数据导入数据库。
mysqlimport 本质上是 LOAD DATA INFILE 命令的一个便捷包装器。
实际示例
假设我们有一个名为 mydb 的数据库,并且有一个名为 users 的表,其结构与下面 CSV 文件匹配。
文件:users.csv
1,John Doe,john.doe@example.com ,Jane Smith,jane.smith@example.com
(注意:第一行没有 ID,我们可以用 --ignore-lines=1 跳过标题行)

表结构:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100)
);
执行导入命令:
# 连接到本地 MySQL,将 users.csv 的数据导入 mydb 数据库的 users 表 # --local 表示从客户端本地读取文件 # --ignore-lines=1 表示忽略第一行(标题) mysqlimport -u root -p --local --ignore-lines=1 mydb users.csv
输入密码后,mysqlimport 会执行导入操作。
第二部分:如何在 C 语言程序中调用 mysqlimport
既然 mysqlimport 是一个外部命令,我们可以在 C 程序中使用 system() 函数来执行它。system() 函数会启动一个子 shell 来执行指定的命令字符串。
示例 C 代码
下面是一个完整的 C 程序示例,它演示了如何构造并执行 mysqlimport 命令。
准备文件:
- 创建一个名为
data.csv的文件,内容如下:101,Alice,alice@example.com 102,Bob,bob@example.com
- 确保你已经有一个 MySQL 数据库和表。
CREATE DATABASE IF NOT EXISTS mytestdb; USE mytestdb; CREATE TABLE IF NOT EXISTS employees ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50) );
C 代码 (importer.c):
#include <stdio.h>
#include <stdlib.h> // 用于 system() 函数
int main() {
// --- 1. 定义参数 ---
const char* user = "root";
// 注意:在生产环境中,直接在命令行中写密码是不安全的。
// 最好让用户交互式输入,或者使用配置文件。
const char* password = "your_password";
const char* host = "localhost";
const char* port = "3306";
const char* database = "mytestdb";
const char* filename = "data.csv";
// --- 2. 构造 mysqlimport 命令字符串 ---
// 使用 snprintf 来安全地格式化字符串,防止缓冲区溢出。
// 注意:命令中不能有空格,除非用引号括起来。
// 这里我们把密码参数分开,这样更安全,避免在命令历史中暴露密码。
char command[512];
// 构造不包含密码的命令部分
snprintf(command, sizeof(command),
"mysqlimport -u %s -h %s -P %s --local %s %s",
user, host, port, database, filename);
// --- 3. 执行命令 ---
printf("准备执行命令:\n%s\n", command);
printf("系统将提示您输入密码...\n");
// system() 函数会执行命令,如果命令执行成功,返回 0。
// 注意:这里的 -p 后面没有跟密码,这样 mysqlimport 会安全地提示用户输入。
int result = system(command);
if (result == 0) {
printf("数据导入成功!\n");
} else {
// 非 0 返回值表示命令执行失败
perror("执行 mysqlimport 命令失败");
// 可以根据 result 的具体值判断错误原因
// 127 表示找不到命令,126 表示权限问题等。
}
return 0;
}
如何编译和运行
- 保存代码:将上面的代码保存为
importer.c。 - 编译:打开终端,使用 GCC 进行编译。
gcc importer.c -o importer
- 运行:执行生成的可执行文件。
./importer
运行过程和预期输出:
准备执行命令:
mysqlimport -u root -h localhost -P 3306 --local mytestdb data.csv
系统将提示您输入密码...
Enter password:
数据导入成功!
当你输入正确的密码后,data.csv 文件的内容就会被导入到 mytestdb 数据库的 data 表中。
替代方案:使用 C API 直接导入(更强大、更灵活)
虽然通过 system() 调用 mysqlimport 很简单,但它有几个缺点:
- 性能开销:需要创建一个新的进程,启动 shell,再启动
mysqlimport。 - 控制力弱:难以捕获
mysqlimport的详细输出或错误信息(哪一行数据出错了)。 - 安全性:处理密码时需要特别小心。
对于更健壮的应用程序,推荐使用 MySQL C API (libmysqlclient) 或其现代分支 MySQL Connector/C,这种方式让你直接在 C 代码中执行 SQL 语句,完全绕过了外部命令。
使用 C API 的概念步骤
-
包含头文件和链接库:
#include <mysql/mysql.h> // 或 #include <mysql.h>
编译时需要链接
-lmysqlclient。 -
初始化连接句柄:
MYSQL *conn; conn = mysql_init(NULL);
-
连接到 MySQL 服务器:
if (!mysql_real_connect(conn, "host", "user", "password", "database", 0, NULL, 0)) { fprintf(stderr, "连接失败: %s\n", mysql_error(conn)); // ... 错误处理 ... } -
构造并执行
LOAD DATA INFILE语句:// 注意:文件路径必须是服务器能访问到的路径,或者使用 LOCAL 选项 const char *query = "LOAD DATA LOCAL INFILE 'data.csv' " "INTO TABLE employees " "FIELDS TERMINATED BY ',' " "LINES TERMINATED BY '\n' " "IGNORE 1 LINES"; // 如果有标题行 if (mysql_query(conn, query)) { fprintf(stderr, "查询失败: %s\n", mysql_error(conn)); // ... 错误处理 ... } else { printf("数据通过 C API 成功导入!\n"); } -
关闭连接:
mysql_close(conn);
这种方式提供了对数据库操作的完全控制,是专业 C 语言应用程序与 MySQL 交互的标准方式。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
system() 调用 mysqlimport |
实现简单,代码少 | 性能开销大,控制力弱,安全性较低,难以处理复杂错误 | 快速脚本、简单的工具、一次性任务 |
| 使用 MySQL C API | 性能高,控制力强,安全,功能全面 | 代码复杂,需要学习 API,需要手动管理内存和连接 | 功能完善的应用程序、高性能服务、需要精细错误处理的场景 |
对于您的需求,如果只是想在 C 程序中快速实现一个导入功能,system() 调用 mysqlimport 是一个可行的捷径,但如果您正在开发一个正式的、高性能的应用程序,强烈建议您学习和使用 MySQL C API。
