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

Linux C 語言訪問 MySQL 完整教程:連接、錯誤處理與最佳實踐

     編輯:MySQL 綜合教學

Linux C 語言訪問 MySQL 完整教程:連接、錯誤處理與最佳實踐

8.3 使用 C 語言訪問 MySQL 數據

Windows 下可通過 ODBC 驅動訪問,Linux 同樣支持 ODBC,但原生 C API (libmysqlclient) 性能更優、依賴更少。本節系統講解核心 API 調用流程。

8.3.1 連接例程詳解

兩步建立連接:

  1. 初始化連接句柄結構
  2. 實際建立網絡連接

步驟 1:mysql_init 初始化句柄

#include <mysql.h>
MYSQL *mysql_init(MYSQL *mysql);
  • 傳入 NULL → 分配並返回新結構指針
  • 傳入已有結構 → 重新初始化該結構
  • 失敗返回 NULL

步驟 2:mysql_real_connect 建立連接

MYSQL *mysql_real_connect(MYSQL *connection,
    const char *host,        // 主機名或 IP,localhost 走 Unix socket 優化
    const char *user,        // 用戶名,NULL 取當前系統用戶
    const char *password,    // 密碼,NULL 僅訪問無密庫
    const char *database,    // 默認庫
    unsigned int port,       // 0 使用默認 3306
    const char *unix_socket, // NULL 使用默認 socket
    unsigned int flags);     // 特殊協議標誌 (壓縮、SSL 等)
  • connection 必須是 mysql_init 初始化過的指針
  • 密碼傳輸前自動加密
  • 失敗返回 NULL,調用 mysql_error() 獲取詳情

連接選項設置 (mysql_options)

int mysql_options(MYSQL *connection, enum option, const char *arg);

常用選項:

選項參數類型說明
MYSQL_OPT_CONNECT_TIMEOUTconst unsigned int*連接超時秒數
MYSQL_OPT_COMPRESSNULL啟用壓縮協議
MYSQL_INIT_COMMANDconst char*連接建立後自動執行的 SQL
// 設置 7 秒連接超時
unsigned int timeout = 7;
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, (char*)&timeout);
conn = mysql_real_connect(conn, "localhost", "rick", "secret", "foo", 0, NULL, 0);

關閉連接

void mysql_close(MYSQL *connection);
  • 釋放 mysql_init 分配的內存
  • 指針失效,不可重用
  • 通常在程序退出前調用

完整示例:connect1.c

#include <stdio.h>
#include <mysql.h>

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (!conn) { fprintf(stderr, "mysql_init failed\n"); return 1; }

    if (!mysql_real_connect(conn, "localhost", "rick", "secret", "foo", 0, NULL, 0)) {
        fprintf(stderr, "Connect failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    printf("Connected to MySQL successfully!\n");
    mysql_close(conn);
    return 0;
}

編譯命令 (若報 mysql.h 缺失,參見 Linux 找不到 mysql.h 解決方案):

gcc connect1.c -o connect1 -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

8.3.2 錯誤處理機制

MySQL C API 通過連接句柄返回錯誤信息,兩大核心函數:

unsigned int mysql_errno(MYSQL *conn);   // 錯誤碼,0 表示無錯誤
char *mysql_error(MYSQL *conn);          // 人類可讀錯誤文本

關鍵點:

  • 錯誤碼定義於 errmsg.h (客戶端) 和 mysqld_error.h (服務端)
  • mysql_error 返回靜態緩衝區指針,若需持久化請 strdup 複製
  • mysql_real_connect 失敗返回 NULL,但若句柄為堆疊變量而非動態分配,仍可通過該句柄調用錯誤函數

進階示例:connect2.c (堆疊句柄 + 完整錯誤處理)

MYSQL conn;  // 非動態分配
mysql_init(&conn);
if (!mysql_real_connect(&conn, "localhost", "rick", "secret", "foo", 0, NULL, 0)) {
    fprintf(stderr, "Connect error %u: %s\n", mysql_errno(&conn), mysql_error(&conn));
    return 1;
}
// ... 業務邏輯
mysql_close(&conn);

實戰建議

  1. 資源管理:配合 goto cleanup 或 RAII 包裝器確保異常路徑釋放連接
  2. 連接池:高併發場景建議使用成熟連接池庫 (如 libmysqlclient 內置池或第三方)
  3. 預處理語句:mysql_stmt_prepare 系列 API 防注入、提升重複執行性能
  4. 字符集:連接後執行 SET NAMES utf8mb4 避免亂碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved