首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

C語言操作 MySQL 完整教學:連線、查詢、編譯與 API 關鍵函數解析

     編輯:MySQL 綜合教學

C 語言開發 MySQL 應用全流程指南

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;
}

二、關鍵 API 流程解析

步驟函數說明
初始化mysql_init()分配/初始化 MYSQL 結構體
建立連線mysql_real_connect()主機、帳號、密碼、資料庫、連接埠、Unix socket、客戶端旗標
執行 SQLmysql_query()同步執行,非 0 表失敗
取得結果集mysql_store_result()將完整結果集讀入客戶端記憶體(適合小/中結果集)
逐行抓取mysql_fetch_row()回傳 MYSQL_ROW(字串陣列),NULL 表結束
釋放結果mysql_free_result()必須呼叫,避免記憶體洩漏
關閉連線mysql_close()釋放連線資源

三、編譯與執行

GCC 編譯指令

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!

四、進階主題導引

  • Prepared Statements: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 與非同步介面,打造高效能資料存取層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved