C/C++ 訪問 MySQL 推薦使用官方 libmysqlclient C API,無需額外 ODBC 驅動,性能最優、依賴最少。本文涵蓋 VS2010/2015 環境配置、核心 API 調用流程、完整代碼示例、64 位編譯陷阱與常用 API 速查表。
MySQL 安裝目录\include(如 C:\Program Files\MySQL\MySQL Server 5.7\include)libmysql.lib、libmysql.dll 複製至專案目錄#include "winsock.h" // Windows Socket 依賴
#include "mysql.h"
#pragma comment(lib, "libmysql.lib")
MYSQL m_sqlCon;
bool ConnectDB() {
try {
mysql_init(&m_sqlCon);
// host, user, pass, db, port, unix_socket, client_flag
if (!mysql_real_connect(&m_sqlCon, "localhost", "root", "root", "test", 3306, NULL, 0)) {
AfxMessageBox(_T("數據庫連接失敗! ") + CString(mysql_error(&m_sqlCon)));
return false;
}
// 設置字符集(防中文亂碼)
mysql_set_character_set(&m_sqlCon, "utf8mb4");
return true;
} catch (...) {
return false;
}
}
void CloseDB() {
mysql_close(&m_sqlCon);
}
bool ExecuteSQL(const char* sql) {
if (mysql_real_query(&m_sqlCon, sql, (unsigned long)strlen(sql)) != 0) {
const char* err = mysql_error(&m_sqlCon);
// 記錄錯誤
return false;
}
return true;
}
// 創建表示例
ExecuteSQL("CREATE TABLE IF NOT EXISTS DS_Building("
"ID VARCHAR(10) PRIMARY KEY,"
"Name VARCHAR(255),"
"Descs VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
bool QueryData(const char* sql) {
if (mysql_real_query(&m_sqlCon, sql, (unsigned long)strlen(sql)) != 0) return false;
MYSQL_RES* result = mysql_store_result(&m_sqlCon); // 獲取完整結果集
if (!result) return false;
int num_fields = mysql_num_fields(result);
MYSQL_FIELD* fields = mysql_fetch_fields(result); // 列元數據
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
for (int i = 0; i < num_fields; ++i) {
printf("%s: %s\t", fields[i].name, row[i] ? row[i] : "NULL");
}
printf("\n");
}
mysql_free_result(result); // 必須釋放
return true;
}
現象:LNK2019 無法解析的外部符號 _mysql_init@4 等
原因:VS 默認目標平台為 x86 (32位),而安裝的 MySQL 是 64 位,庫文件架構不匹配。
解決:
libmysql.lib/dll 替換(不推薦,限制進程內存)| 分類 | API | 用途 |
|---|---|---|
| 連接管理 | mysql_init() | 初始化 MYSQL 結構 |
| mysql_real_connect() | 建立連接(推薦) | |
| mysql_close() | 關閉連接 | |
| 查詢執行 | mysql_real_query() | 執行帶長度 SQL(支持二進制) |
| mysql_query() | 執行以 \0 結尾 SQL | |
| mysql_store_result() | 緩存完整結果集到客戶端 | |
| 結果集處理 | mysql_fetch_row() | 逐行獲取 |
| mysql_fetch_field() | 獲取列元數據 | |
| mysql_num_fields/rows() | 列數/行數 | |
| mysql_free_result() | 釋放結果集內存 | |
| 事務控制 | mysql_autocommit() | 開關自動提交 |
| mysql_commit() | 提交事務 | |
| mysql_rollback() | 回滾事務 | |
| 錯誤處理 | mysql_errno() | 錯誤碼 |
| mysql_error() | 錯誤信息 | |
| mysql_sqlstate() | SQLSTATE 代碼 | |
| 預處理 | mysql_stmt_prepare() | 準備語句 |
| mysql_stmt_execute() | 執行預處理 |
MYSQL*、MYSQL_RES*,析構函數自動 mysql_close/mysql_free_result,防洩漏。mysqlcppconn (Connector/C++) 內建池。mysql_set_character_set(&mysql, "utf8mb4")。mysql_stmt_* 防注入、提升重複執行效率。CR_SERVER_GONE_ERROR (2006)、CR_CONNECTION_ERROR (2013) 實施指數退避重連。官方 C API 輕量、高效、無第三方依賴,是 C/C++ 訪問 MySQL 的最佳選擇。關鍵點:x64 平台編譯、RAII 管理資源、utf8mb4 字符集、預處理防注入、錯誤碼驅動重試。掌握核心 10 個 API 即可覆蓋 90% 業務場景。