首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言操作MySQL數據庫完整指南:連接、查詢、編譯與實戰

     編輯:關於C語言

前言

在高性能、高安全性的後端開發中,直接使用 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;
}

二、關鍵 API 說明

函數用途
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!

四、常見問題與最佳實踐

  • 防止 SQL 注入:生產環境請使用 `mysql_stmt_prepare` + 綁定參數,不要直接 `sprintf` 拼接。
  • 字符集:連接後執行 `SET NAMES utf8mb4` 避免中文亂碼。
  • 錯誤處理:所有 API 回傳值必須檢查,善用 `mysql_error()` 記錄日誌。
  • 連接池:高併發場景建議自行實現或使用成熟連接池庫(如 libmysqlclient 內建的多線程支援)。
  • 跨平台:Windows 下需連結 `libmysql.lib`,並確保 `libmysql.dll` 在 PATH 中。

五、延伸閱讀

  • MySQL 官方手冊:C API Reference
  • 《MySQL 程式設計》— Paul DuBois
  • MariaDB Connector/C(輕量級替代品)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved