首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C API 遠程連接 MySQL 服務器:mysql_real_connect 完整實戰指南

     編輯:MySQL 資料庫相關知識

核心流程

  1. 初始化 MYSQL 結構體:MYSQL *mysql = mysql_init(NULL);
  2. 設置連接選項(可選):mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "client");
  3. 建立連接:使用 mysql_real_connect()(棄用 mysql_connect())
  4. 錯誤處理:檢查返回值,失敗調用 mysql_error(mysql)
  5. 執行 SQL:mysql_query() / mysql_real_query()
  6. 處理結果集:mysql_store_result() / mysql_use_result()
  7. 關閉連接:mysql_close(mysql);

mysql_real_connect 參數詳解

MYSQL *mysql_real_connect(
    MYSQL *mysql,           // mysql_init 返回的句柄
    const char *host,       // 服務器 IP 或主機名,NULL/"localhost" 走本地 socket/pipe
    const char *user,       // MySQL 用戶名,NULL 取當前系統用戶
    const char *passwd,     // 密碼,NULL 僅匹配空密碼賬號
    const char *db,         // 默認數據庫,NULL 不選庫
    unsigned int port,      // TCP 端口,0 走默認 3306
    const char *unix_socket,// socket/pipe 路徑,NULL 用默認
    unsigned long client_flag // 功能標志位組合
);

關鍵參數說明

參數典型值注意事項
host"192.168.1.100"遠程連接必須填 IP;本地可用 NULL 或 "localhost" 走 Unix socket/Windows named pipe
user"app_user"Windows ODBC 必須顯式指定
passwd"StrongPass"勿自行加密,客戶端庫自動處理握手加密
db"myapp_db"連接後默認庫,可後續 mysql_select_db() 切換
port3306非標準端口時指定
unix_socketNULL指定則強制走本地 socket,忽略 host/port
client_flag0 或組合值見下表常用標志

常用 CLIENT_FLAG 組合

標志作用
CLIENT_COMPRESS啟用壓縮協議(慢網絡有效)
CLIENT_FOUND_ROWSmysql_affected_rows() 返回匹配行數而非影響行數
CLIENT_IGNORE_SPACE允許函數名後有空格(所有函數名成為保留字)
CLIENT_INTERACTIVE使用 interactive_timeout 替代 wait_timeout
CLIENT_LOCAL_FILES啟用 LOAD DATA LOCAL INFILE
CLIENT_MULTI_STATEMENTS支持單次調用執行多條 SQL(分號分隔)
CLIENT_MULTI_RESULTS支持多結果集(存儲過程、多語句自動置位)
CLIENT_SSL使用 SSL 加密連接(需先 mysql_ssl_set())

完整示例代碼

#include 
#include 
#include 

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

    // 可選:讀取 [client] 組配置
    mysql_options(conn, MYSQL_READ_DEFAULT_GROUP, "myclient");

    // 遠程連接
    if (!mysql_real_connect(conn, "192.168.1.100", "app_user", "StrongPass",
                            "myapp_db", 3306, NULL, CLIENT_MULTI_STATEMENTS)) {
        fprintf(stderr, "Connection failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return EXIT_FAILURE;
    }

    printf("Connected! Server version: %s\n", mysql_get_server_info(conn));

    // 執行查詢
    if (mysql_query(conn, "SELECT VERSION(), CURRENT_DATE")) {
        fprintf(stderr, "Query failed: %s\n", mysql_error(conn));
    } else {
        MYSQL_RES *res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                printf("Version: %s, Date: %s\n", row[0], row[1]);
            }
            mysql_free_result(res);
        }
    }

    mysql_close(conn);
    return EXIT_SUCCESS;
}

編譯鏈接

# Linux
gcc -o mysql_client mysql_client.c $(mysql_config --cflags --libs)

# Windows (MSVC)
cl mysql_client.c /I "C:\Program Files\MySQL\MySQL Server 8.0\include" \
    /link "C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.lib"

常見問題

  • CR_CONN_HOST_ERROR:網絡不通、防火牆攔截、host 解析失敗
  • CR_CONNECTION_ERROR:本地 socket/pipe 連接失敗,檢查 mysqld.sock 路徑或管道名
  • CR_VERSION_ERROR:客戶端庫版本過老,不支持服務器協議,升級 libmysqlclient
  • Authentication plugin 錯誤:MySQL 8.0 默認 caching_sha2_password,舊庫不支持,需用戶改用 mysql_native_password 或升級連接器
  • Linux 系統用戶驗證:MySQL 賬號獨立於系統賬號,無需同步密碼;若需 PAM 認證請配置 authentication_pam 插件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved