C 語言透過 MySQL C API 直連資料庫,具備高效能、低延遲、易嵌入 PHP/Java 等上層優勢。本文以完整範例示範 Linux 下編譯執行全流程,涵蓋連線、參數化查詢、結果集處理、資源釋放與錯誤處理。
#if defined(_WIN32) || defined(_WIN64)
#include
#endif
#include
#include
#include "mysql.h"
#define SELECT_QUERY "SELECT username FROM tbb_user WHERE userid = %d"
int main(int argc, char **argv) {
MYSQL mysql, *sock;
MYSQL_RES *res;
MYSQL_ROW row;
char qbuf[160];
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(1);
}
mysql_init(&mysql);
if (!(sock = mysql_real_connect(&mysql, "localhost", "dbuser", "dbpwd", "9tmd_bbs_utf8", 0, NULL, 0))) {
fprintf(stderr, "Connect failed: %s\n", mysql_error(&mysql));
exit(1);
}
sprintf(qbuf, SELECT_QUERY, atoi(argv[1]));
if (mysql_query(sock, qbuf)) {
fprintf(stderr, "Query failed: %s\n", mysql_error(sock));
exit(1);
}
if (!(res = mysql_store_result(sock))) {
fprintf(stderr, "Store result failed: %s\n", mysql_error(sock));
exit(1);
}
printf("Fields returned: %d\n", mysql_num_fields(res));
while ((row = mysql_fetch_row(res))) {
printf("User #%d name: %s\n", atoi(argv[1]), row[0] ? row[0] : "NULL");
puts("Query OK!");
}
mysql_free_result(res);
mysql_close(sock);
return 0;
}
| 步驟 | 函數 | 說明 |
|---|---|---|
| 初始化 | mysql_init() | 分配/初始化 MYSQL 結構體 |
| 建立連線 | mysql_real_connect() | 主機、帳號、密碼、資料庫、連接埠、Unix socket、客戶端旗標 |
| 執行 SQL | mysql_query() | 同步執行,非 0 表失敗 |
| 取得結果集 | mysql_store_result() | 將完整結果集讀入客戶端記憶體(適合小/中結果集) |
| 逐行抓取 | mysql_fetch_row() | 回傳 MYSQL_ROW(字串陣列),NULL 表結束 |
| 釋放結果 | mysql_free_result() | 必須呼叫,避免記憶體洩漏 |
| 關閉連線 | mysql_close() | 釋放連線資源 |
gcc -o mysql_select mysql_select.c \
-I/usr/local/include/mysql \
-L/usr/local/lib/mysql \
-lmysqlclient -lz -lm
-I:標頭檔路徑(含 mysql.h)-L:庫檔路徑(含 libmysqlclient.so)-lmysqlclient:連結 MySQL 客戶端庫-lz -lm:視編譯環境可能需要的壓縮/數學庫./mysql_select 1
# 輸出範例
Fields returned: 1
User #1 name: Michael
Query OK!
mysql_stmt_prepare/bind_param/execute 防 SQL 注入、提升重複執行效能。libmysqlclient 內建池化(8.0+)。mysql_errno() / mysql_sqlstate() 區分重試與永久失敗。mysql_use_result() 串流模式,降低記憶體佔用。MySQL 官方 C API 文件:https://dev.mysql.com/doc/c-api/8.0/en/
掌握基礎流程後,建議深入研究 Prepared Statements 與非同步介面,打造高效能資料存取層。