核心流程
- 初始化 MYSQL 結構體:
MYSQL *mysql = mysql_init(NULL);
- 設置連接選項(可選):
mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "client");
- 建立連接:使用
mysql_real_connect()(棄用 mysql_connect())
- 錯誤處理:檢查返回值,失敗調用
mysql_error(mysql)
- 執行 SQL:
mysql_query() / mysql_real_query()
- 處理結果集:
mysql_store_result() / mysql_use_result()
- 關閉連接:
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() 切換 |
| port | 3306 | 非標準端口時指定 |
| unix_socket | NULL | 指定則強制走本地 socket,忽略 host/port |
| client_flag | 0 或組合值 | 見下表常用標志 |
常用 CLIENT_FLAG 組合
| 標志 | 作用 |
CLIENT_COMPRESS | 啟用壓縮協議(慢網絡有效) |
CLIENT_FOUND_ROWS | mysql_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 插件