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

Linux C/C++ 呼叫 MySQL C API 完整實戰:從編譯到 CRUD 操作

     編輯:MySQL 資料庫相關知識

開發環境準備

  • 安裝 MySQL 開發套件:yum install mysql-devel(CentOS/RHEL)或 apt-get install libmysqlclient-dev(Debian/Ubuntu)。
  • 確認頭檔與庫路徑:通常為 /usr/include/mysql/ 與 /usr/lib64/mysql/。

核心程式碼範例(現代化寫法)

#include <mysql/mysql.h>
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main() {
    // 連線參數
    const char* host = "127.0.0.1";
    const char* user = "db_user";
    const char* pass = "db_pass";
    const char* db   = "test_db";
    unsigned int port = 3306;

    // 1. 初始化 MYSQL 物件
    MYSQL* conn = mysql_init(nullptr);
    if (!conn) {
        cerr << "mysql_init() failed" << endl;
        return EXIT_FAILURE;
    }

    // 2. 建立連線(啟用自動重連)
    my_bool reconnect = 1;
    mysql_options(conn, MYSQL_OPT_RECONNECT, &reconnect);
    if (!mysql_real_connect(conn, host, user, pass, db, port, nullptr, 0)) {
        cerr << "Connect failed: " << mysql_error(conn) << endl;
        mysql_close(conn);
        return EXIT_FAILURE;
    }
    cout << "Connected to MySQL " << mysql_get_server_info(conn) << endl;

    // 3. 設定字元集(防止中文亂碼)
    if (mysql_set_character_set(conn, "utf8mb4")) {
        cerr << "Charset set failed: " << mysql_error(conn) << endl;
    }

    // 4. 執行查詢
    const char* sql = "SELECT id, name, email FROM users LIMIT 10";
    if (mysql_query(conn, sql)) {
        cerr << "Query failed: " << mysql_error(conn) << endl;
    } else {
        MYSQL_RES* res = mysql_store_result(conn);
        if (res) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res))) {
                // row[0]=id, row[1]=name, row[2]=email
                cout << "ID: " << (row[0] ? row[0] : "NULL")
                     << " | Name: " << (row[1] ? row[1] : "NULL")
                     << " | Email: " << (row[2] ? row[2] : "NULL") << endl;
            }
            mysql_free_result(res);
        }
    }

    // 5. 執行更新(INSERT/UPDATE/DELETE)
    const char* insert_sql = "INSERT INTO users(name,email) VALUES('Alice','alice@example.com')";
    if (mysql_query(conn, insert_sql)) {
        cerr << "Insert failed: " << mysql_error(conn) << endl;
    } else {
        cout << "Inserted rows: " << mysql_affected_rows(conn)
             << " | Last Insert ID: " << mysql_insert_id(conn) << endl;
    }

    // 6. 釋放資源
    mysql_close(conn);
    return EXIT_SUCCESS;
}

編譯與連結

# 使用 mysql_config 自動獲取編譯參數(推薦)
g++ -std=c++17 -o mysql_demo mysql_demo.cpp $(mysql_config --cflags --libs)

# 或手動指定(視安裝路徑調整)
g++ -std=c++17 -o mysql_demo mysql_demo.cpp \
    -I/usr/include/mysql \
    -L/usr/lib64/mysql -lmysqlclient

關鍵 API 對照表

函數用途備註
mysql_init()初始化 MYSQL 結構傳 nullptr 自動分配
mysql_real_connect()建立真實連線支援 SSL、壓縮、壓縮協議
mysql_set_character_set()設定連線字元集建議 utf8mb4
mysql_query()執行 SQL 語句成功返回 0
mysql_store_result()取得完整結果集(緩衝模式)大結果集建議 mysql_use_result()
mysql_fetch_row()逐行取得資料返回 MYSQL_ROW (char**)
mysql_free_result()釋放結果集記憶體必須成對呼叫
mysql_affected_rows()影響行數INSERT/UPDATE/DELETE 適用
mysql_insert_id()取得 AUTO_INCREMENT 值僅對上一條 INSERT 有效
mysql_close()關閉連線並釋放資源程式結束前必呼叫

進階主題

  • Prepared Statements:使用 MYSQL_STMT 防止 SQL 注入、提升重複執行效能。
  • 連線池:生產環境建議使用成熟連線池庫(如 mysqlpp、soci、cppconn)。
  • 錯誤處理:善用 mysql_errno()、mysql_sqlstate() 區分錯誤類型。

掌握 C API 基礎,再配合現代 C++ 封裝,即可構建高效穩定的資料庫應用。

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