在 Linux 系統上開發需要存取 MySQL 資料庫的 C/C++ 應用程式時,正確配置開發環境與理解核心 API 是關鍵。本文將詳細介紹從安裝開發函式庫、編譯參數設定,到核心連接函數的使用與完整程式碼範例,幫助你快速上手。
預設系統並未安裝 C/C++ 開發所需的標頭檔與連結庫,需透過套件管理器安裝 libmysqlclient-dev(舊版 Ubuntu 可能名為 libmysqld-dev):
sudo apt-get update
sudo apt-get install libmysqlclient-dev
安裝完成後,標頭檔將位於 /usr/include/mysql/ 目錄下,包含 mysql.h 等關鍵檔案。
需加入 -lmysqlclient 連結選項:
g++ -lmysqlclient mysql_test.cpp -o mysqltest
mysqlclient所有函數皆宣告於 <mysql/mysql.h>,程式開頭需包含:
#include <mysql/mysql.h>
MYSQL *mysql_init(MYSQL *connection);
// 成功返回 MYSQL 結構指標,失敗返回 NULL
傳入 NULL 可讓函數自動配置記憶體,建議寫法:
MYSQL *conn = mysql_init(NULL);
if (!conn) { /* 處理錯誤 */ }
MYSQL *mysql_real_connect(
MYSQL *connection,
const char *host, // 伺服器主機名或 IP
const char *user, // 使用者名稱
const char *passwd, // 密碼
const char *db, // 資料庫名稱(可為 NULL)
unsigned int port, // 連接埠,通常為 0 使用預設 3306
const char *unix_socket, // Unix socket 路徑,通常為 NULL
unsigned int client_flag // 客戶端旗標,通常為 0
);
// 成功返回連線控制指標,失敗返回 NULL
void mysql_close(MYSQL *connection);
// 關閉連線並釋放連線控制結構記憶體,指標失效
mysql_options()必須在 mysql_init() 之後、mysql_real_connect() 之前呼叫:
int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument);
常用選項:
| 選項常數 | 說明 |
|---|---|
MYSQL_INIT_COMMAND | 連線建立時自動執行的 SQL 指令,重連時也會執行 |
MYSQL_OPT_CONNECT_TIMEOUT | 連線逾時秒數(整數字串) |
MYSQL_OPT_COMPRESS | 啟用通訊協定壓縮 |
MYSQL_OPT_PROTOCOL | 指定通訊協定類型(參考 mysql_protocol_type 列舉) |
unsigned int mysql_errno(MYSQL *connection); // 返回錯誤代碼,0 表示無錯誤
const char *mysql_error(MYSQL *connection); // 返回以 null 結尾的錯誤訊息字串
int mysql_query(MYSQL *connection, const char *query);
// 成功返回 0,失敗返回非零值
my_ulonglong mysql_affected_rows(MYSQL *connection);
// 返回上一條 SQL 語句影響的資料列數
以下程式示範連線建立、錯誤處理、從標準輸入讀取 SQL 語句並執行、統計影響列數、最後正確關閉連線。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <mysql/mysql.h>
#include <string>
using namespace std;
void print_mysql_error(MYSQL *conn) {
if (mysql_errno(conn)) {
cerr << "Error " << mysql_errno(conn) << " : " << mysql_error(conn) << endl;
}
}
int main() {
MYSQL *conn = mysql_init(NULL);
if (!conn) {
cerr << "mysql_init() failed!" << endl;
return EXIT_FAILURE;
}
// 連線參數請依實際環境修改
if (!mysql_real_connect(conn, "localhost", "root", "123456", "test", 0, NULL, 0)) {
cerr << "Connection to MySQL failed!" << endl;
print_mysql_error(conn);
mysql_close(conn);
return EXIT_FAILURE;
}
cout << "Connected to MySQL server successfully." << endl;
string sql_line;
int total_affected = 0;
int query_result = 0;
cout << "Enter SQL statements (type 'close' or empty line to exit):" << endl;
while (getline(cin, sql_line)) {
if (sql_line == "close" || sql_line.empty()) break;
query_result = mysql_query(conn, sql_line.c_str());
if (query_result) {
print_mysql_error(conn);
break;
}
total_affected += mysql_affected_rows(conn);
cout << "OK. Affected rows: " << mysql_affected_rows(conn) << endl;
}
cout << "Total affected rows: " << total_affected << endl;
mysql_close(conn);
cout << "Connection closed." << endl;
return EXIT_SUCCESS;
}
libmysqlclient-dev 已安裝,且包含路徑正確(-I/usr/include/mysql 通常由 pkg-config 自動處理)。bind-address 設定、使用者權限與密碼。SET NAMES utf8mb4 或使用 mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4")。mysql_close()。mysql_stmt_prepare() 等預處理 API,防止 SQL 注入並提升效能。掌握 mysql_init、mysql_real_connect、mysql_query、mysql_affected_rows、mysql_error 等核心函數,配合正確的編譯連結參數,即可在 Linux 上開發高效穩健的 C/C++ MySQL 客戶端程式。下一篇將深入探討結果集處理、預處理語句與交易控制。