在 Linux 環境下使用 C 語言操作 MySQL 資料庫,核心流程為:初始化連線控制結構 → 建立實際連線 → 執行 SQL → 處理結果/錯誤 → 關閉連線。本文針對 CentOS 6.4 (64 位元) 環境,提供完整編譯鏈接參數、連線管理、錯誤處理、非查詢與查詢型 SQL 執行範例,並解決 mysqlclient 庫路徑找不到的常見問題。
mysql_init(MYSQL*):分配/初始化 MYSQL 結構,傳 NULL 回傳新指標。mysql_real_connect():提供主機、用戶、密碼、資料庫、埠、Socket、旗標等參數建立 TCP/Unix Socket 連線。mysql_query() / mysql_real_query():執行 SQL 字串(無結尾分號),二進位資料用後者。mysql_store_result() / mysql_use_result():取得結果集(SELECT/SHOW/DESCRIBE)。mysql_fetch_row():逐列取得資料。mysql_free_result():釋放結果集記憶體。mysql_affected_rows():INSERT/UPDATE/DELETE 影響列數。mysql_errno() / mysql_error():取得錯誤碼與訊息。mysql_close():關閉連線並釋放結構(若由 mysql_init(NULL) 配置)。# 錯誤:找不到 -lmysqlclient
gcc -I/usr/include/mysql connect.c -L/usr/lib/mysql -lmysqlclient -o connect
# 正確:CentOS 6.4 64位庫在 /usr/lib64/mysql
gcc -I/usr/include/mysql connect.c -L/usr/lib64/mysql -lmysqlclient -o connect
原則:-L 必須指向對應架構的庫目錄(lib64 而非 lib)。
#include <stdlib.h>
#include <stdio.h>
#include <mysql.h>
int main() {
MYSQL mysql_conn;
mysql_init(&mysql_conn); // 非動態分配結構
if (mysql_real_connect(&mysql_conn, "localhost", "root", "yao", "test", 0, NULL, 0)) {
printf("連線成功\n");
int res = mysql_query(&mysql_conn,
"INSERT INTO child(childid, age, name) VALUES (1, 12, 'bing')");
if (!res) {
printf("插入 %lu 筆資料\n",
(unsigned long)mysql_affected_rows(&mysql_conn));
} else {
fprintf(stderr, "插入失敗 %d: %s\n",
mysql_errno(&mysql_conn), mysql_error(&mysql_conn));
}
mysql_close(&mysql_conn);
} else {
fprintf(stderr, "連線失敗\n");
if (mysql_errno(&mysql_conn)) {
fprintf(stderr, "錯誤 %d: %s\n",
mysql_errno(&mysql_conn), mysql_error(&mysql_conn));
}
}
return 0;
}
mysql_options()(僅能在 init 與 connect 之間呼叫)| 選項 | 參數型別 | 說明 |
|---|---|---|
MYSQL_OPT_CONNECT_TIMEOUT | const unsigned int* | 連線逾時秒數 |
MYSQL_OPT_COMPRESS | NULL | 啟用壓縮協定 |
MYSQL_INIT_COMMAND | const char* | 連線建立後自動執行的 SQL |
| 方式 | 程式碼 | 釋放責任 |
|---|---|---|
| 動態 | MYSQL* conn = mysql_init(NULL); | mysql_close(conn) 釋放結構 |
| 非動態 | MYSQL conn; mysql_init(&conn); | mysql_close(&conn) 僅關閉連線,結構在堆疊自動銷毀 |
非動態分配避免 malloc 失敗風險,適合嵌入式/高可靠場景。
mysql_stmt_prepare() 參數化查詢(Prepared Statements)。SET NAMES utf8mb4 確保中文正確存取。MYSQL_OPT_RECONNECT 或自行實作心跳檢查。mysql_store_result() 將全表載入記憶體,大結果集請改用 mysql_use_result() 串流讀取。MYSQL 結構非執行緒安全,每執行緒獨立建立連線。掌握 mysql_init → real_connect → query → error/result → close 標準流程,正確指定 -L/usr/lib64/mysql,並建立錯誤處理習慣,即可在 CentOS 上穩健開發 C/MySQL 應用。後續可進階學習預處理語句、連線池、非同步介面以提升效能與安全性。