在 Visual Studio 2013 中使用 MySQL 官方 C API(libmysql.lib)連線 MySQL 5.6 64位,記錄專案配置、平台設定、程式碼範例與常見坑點。
include、lib 目錄)x64、複製自 Win32x64原因:MySQL 64位庫僅能被 64位程式載入,預設 Win32 會導致「無法解析的外部符號」連結錯誤。
專案屬性 → VC++ 目錄(或 C/C++ → 一般 / 連結器 → 一般):
C:\Program Files\MySQL\MySQL Server 5.6\includeC:\Program Files\MySQL\MySQL Server 5.6\lib將 libmysql.dll 從 MySQL lib 目錄複製至專案輸出目錄(與 .exe 同層)或系統 PATH 目錄,否則執行時提示「找不到 libmysql.dll」。
#include // 必須在 mysql.h 之前
#include
#include
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
int main() {
MYSQL mysql;
MYSQL_RES *result = nullptr;
MYSQL_ROW row;
// 初始化
mysql_init(&mysql);
// 連線
if (!mysql_real_connect(&mysql, "localhost", "root", "root", "dnd", 3306, NULL, 0)) {
std::cerr << "連線失敗: " << mysql_error(&mysql) << std::endl;
return 1;
}
std::cout << "連線成功!" << std::endl;
// 設定字符集(避免中文亂碼)
mysql_set_character_set(&mysql, "utf8");
// 執行查詢
const char *sql = "SELECT * FROM user";
if (mysql_query(&mysql, sql)) {
std::cerr << "查詢失敗: " << mysql_error(&mysql) << std::endl;
mysql_close(&mysql);
return 1;
}
// 取得結果集
result = mysql_store_result(&mysql);
if (!result) {
std::cerr << "結果集獲取失敗: " << mysql_error(&mysql) << std::endl;
mysql_close(&mysql);
return 1;
}
// 遍歷列印
while ((row = mysql_fetch_row(result))) {
// row[0], row[1]... 對應 SELECT 選項順序
std::cout << "ID: " << row[0] << ", Name: " << (row[1] ? row[1] : "NULL") << std::endl;
}
// 釋放資源
mysql_free_result(result);
mysql_close(&mysql);
return 0;
}
| 問題 | 解決 |
|---|---|
| 編譯錯誤:找不到 mysql.h | 檢查包含目錄路徑、確認 MySQL 安裝版包含 include 目錄 |
| 連結錯誤:LNK2019 未解析符號 | 平台必須設為 x64,庫目錄指向 lib 而非 lib\debug |
| 執行錯誤:libmysql.dll 找不到 | 複製 libmysql.dll 至專案輸出目錄或加入系統 PATH |
| 中文亂碼 | 連線後呼叫 mysql_set_character_set(&mysql, "utf8") |
| 字串字面值編碼 | 原始碼檔案儲存為 UTF-8(含 BOM)或專案字符集設為 65001 |
char *sql = "SELECT * FROM user"; // 字串字面值,存儲在唯讀資料段
sql = "I am Zenki Kong"; // 僅改變指標指向,原字面值仍存在,無洩漏
// 若用 malloc/strdup 動態分配,則需 free() 釋放
字串字面值由編譯器管理生命週期,重新賦值指標不會洩漏;動態分配才需手動釋放。
官方提供 MySQL Connector/C++,支援 JDBC 風格 API、預處理語句、連線池,物件導向更友善,推薦新專案使用。