在高性能、高安全性的後端開發中,直接使用 C 語言呼叫 MySQL C API 是常見選擇。本文以 Linux 環境為例,完整展示如何編寫、編譯、執行一個連接 MySQL、執行參數化查詢並輸出結果的 C 程式,適合嵌入式、高併發服務或 PHP/JSP 擴展模組開發參考。
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h> // 通常在 /usr/local/include/mysql
#define SELECT_QUERY "select username from tbb_user where userid = %d"
int main(int argc, char **argv) {
MYSQL mysql, *sock;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
char qbuf[160];
// 1. 參數檢查
if (argc != 2) {
fprintf(stderr, "Usage: %s <userid>\n", argv[0]);
exit(1);
}
// 2. 初始化連接句柄
mysql_init(&mysql);
// 3. 真實連接:主機、用戶、密碼、資料庫、port、unix_socket、client_flag
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);
}
// 4. 構建參數化 SQL
sprintf(qbuf, SELECT_QUERY, atoi(argv[1]));
// 5. 執行查詢
if (mysql_query(sock, qbuf)) {
fprintf(stderr, "Query failed: %s\n", mysql_error(sock));
exit(1);
}
// 6. 獲取結果集
if (!(res = mysql_store_result(sock))) {
fprintf(stderr, "Store result failed: %s\n", mysql_error(sock));
exit(1);
}
// 7. 輸出欄位數與逐行數據
printf("Fields returned: %d\n", mysql_num_fields(res));
while ((row = mysql_fetch_row(res))) {
printf("UserID #%s username: %s\n",
argv[1],
(row[0] ? row[0] : "NULL"));
puts("Query OK!");
}
// 8. 釋放資源並關閉連接
mysql_free_result(res);
mysql_close(sock);
return 0;
}
| 函數 | 用途 |
|---|---|
| mysql_init() | 初始化 MYSQL 結構體 |
| mysql_real_connect() | 建立真實 TCP/Unix Socket 連接 |
| mysql_query() | 執行 SQL 語句 |
| mysql_store_result() | 將完整結果集讀入客戶端記憶體 |
| mysql_fetch_row() | 逐行取得字串陣列 |
| mysql_free_result() | 釋放結果集記憶體 |
| mysql_close() | 關閉連接 |
# 編譯(根據實際安裝路徑調整 -I -L)
gcc -o mysql_select mysql_select.c \
-I/usr/local/include/mysql \
-L/usr/local/lib/mysql \
-lmysqlclient -lz -lm
# 執行
./mysql_select 1
輸出範例:
Fields returned: 1 UserID #1 username: Michael Query OK!