MySQL 提供嵌入式服務器庫,允許在客戶端應用中直接運行功能完整的 MySQL 服務器,無需獨立進程通信,顯著降低延遲並簡化部署。本文基於 Fedora 8 環境,使用 C 語言調用 MySQL C API 實現學生信息的增刪改查完整流程。
// 1. 初始化 MySQL 庫
mysql_library_init(0, NULL, NULL); // 等效 mysql_server_init()
// 2. 初始化連接句柄
MYSQL *mysql = mysql_init(NULL);
// 3. 連接嵌入式服務器(參數多為 NULL/空字符串)
mysql_real_connect(mysql, NULL, "root", "password", "testdb", 0, NULL, 0);
// 4. 執行 SQL
mysql_real_query(mysql, "SELECT * FROM student", strlen(sql));
// 5. 獲取結果集
MYSQL_RES *res = mysql_store_result(mysql); // 一次性獲取全量結果
// 或 mysql_use_result(mysql); // 流式逐行獲取,適合大結果集
// 6. 遍歷行
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
// row[0]..row[n-1] 為各字段值
}
// 7. 釋放資源
mysql_free_result(res);
mysql_close(mysql);
mysql_library_end(); // 停止嵌入式服務器
| 特性 | mysql_store_result | mysql_use_result |
|---|---|---|
| 內存佔用 | 高(全量緩存客戶端) | 低(單行緩衝) |
| 隨機訪問 | 支持(mysql_data_seek) | 不支持(僅順序) |
| 獲取總行數 | mysql_num_rows 即時可用 | 需遍歷完才知 |
| 適用場景 | 中小結果集、需多次遍歷 | 大結果集、串流處理 |
void Show(char *Table_Name) {
char sql[100];
sprintf(sql, "SELECT * FROM %s", Table_Name);
mysql_real_query(mysql, sql, strlen(sql));
MYSQL_RES *res = mysql_store_result(mysql);
// 打印列名
MYSQL_FIELD *field;
while ((field = mysql_fetch_field(res)))
printf("%s\t\t", field->name);
printf("\n");
// 打印行
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
for (int i = 0; i < mysql_num_fields(res); i++)
printf("%s\t\t", row[i] ? row[i] : "NULL");
printf("\n");
}
mysql_free_result(res);
}
void Insert(char *Table_Name) {
char name[20], id[20], math[10], chinese[10], sql[200];
printf("請輸入名字:"); scanf("%s", name);
printf("請輸入學號:"); scanf("%s", id);
printf("請輸入數學成績:"); scanf("%s", math);
printf("請輸入語文成績:"); scanf("%s", chinese);
sprintf(sql, "INSERT INTO %s VALUES('%s','%s','%s','%s')",
Table_Name, name, id, math, chinese);
mysql_real_query(mysql, sql, strlen(sql));
printf("添加成功!\n");
}
void Delete(char *Table_Name) {
char delName[20], sql[100];
printf("請輸入要刪除的名字:"); scanf("%s", delName);
sprintf(sql, "DELETE FROM %s WHERE name='%s'", Table_Name, delName);
mysql_real_query(mysql, sql, strlen(sql));
printf("刪除成功!\n");
}
void Find(char *Table_Name) {
char findName[20], sql[100];
printf("請輸入查詢名字:"); scanf("%s", findName);
sprintf(sql, "SELECT * FROM %s WHERE name='%s'", Table_Name, findName);
mysql_real_query(mysql, sql, strlen(sql));
MYSQL_RES *res = mysql_store_result(mysql);
MYSQL_FIELD *field;
while ((field = mysql_fetch_field(res)))
printf("%s\t\t", field->name);
printf("\n");
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
for (int i = 0; i < mysql_num_fields(res); i++)
printf("%s\t\t", row[i] ? row[i] : "NULL");
printf("\n");
}
mysql_free_result(res);
}
gcc -o student_mgr student_mgr.c \
-I/usr/include/mysql \
-L/usr/lib/mysql \
-lmysqld -lpthread -lm -lrt -ldl
注意:鏈接嵌入式庫使用 -lmysqld,而非客戶端庫 -lmysqlclient。
if (mysql_errno(mysql)) {
fprintf(stderr, "Error %d: %s\n", mysql_errno(mysql), mysql_error(mysql));
// 釋放資源並退出
}
嵌入式 MySQL 適用於桌面應用、邊緣設備、測試工具等輕量級場景。生產級高併發服務仍建議採用獨立 Server 架構,利用連接池、讀寫分離、集群化提升可用性與擴展性。