開發環境準備
# Ubuntu/Debian
sudo apt-get install libmysqlclient-dev mysql-server gcc make
# 編譯鏈接
gcc -o mysql_demo mysql_demo.c $(mysql_config --cflags --libs)
核心 API 流程
MYSQL *conn = mysql_init(NULL); 初始化連接句柄。
mysql_real_connect(conn, host, user, pass, db, port, unix_socket, flags) 建立連接。
mysql_query(conn, "SQL") 執行 SQL 語句。
MYSQL_RES *res = mysql_use_result(conn) / mysql_store_result(conn) 獲取結果集。
MYSQL_ROW row; while ((row = mysql_fetch_row(res))) 逐行讀取。
mysql_free_result(res); mysql_close(conn); 清理資源。
完整示例:列出 mysql 庫所有表
#include
#include
#include
int main() {
MYSQL *conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "localhost", "root", "password", "mysql", 0, NULL, 0)) {
fprintf(stderr, "連接失敗: %s\n", mysql_error(conn));
exit(1);
}
if (mysql_query(conn, "SHOW TABLES")) {
fprintf(stderr, "查詢失敗: %s\n", mysql_error(conn));
exit(1);
}
MYSQL_RES *res = mysql_use_result(conn);
printf("mysql 數據庫表列表:\n");
MYSQL_ROW row;
while ((row = mysql_fetch_row(res)))
printf("%s\n", row[0]);
mysql_free_result(res);
mysql_close(conn);
return 0;
}
關鍵函數對比
| 函數 | 用途 | 注意 |
mysql_use_result | 逐行流式讀取,佔用少記憶體 | 讀取期間不能執行其他查詢 |
mysql_store_result | 一次性讀取全部結果到客戶端 | 大結果集佔用大量記憶體 |
mysql_fetch_row | 獲取下一行,返回字段指針數組 | NULL 表示無更多行 |
mysql_num_fields | 獲取列數 | 配合 mysql_fetch_field 獲取元數據 |
錯誤處理最佳實踐
- 每次 API 調用後檢查返回值,失敗時調用
mysql_error(conn) 獲取詳細信息。
- 使用
mysql_errno(conn) 區分錯誤碼(如 1062 重複鍵)。
- 長連接需處理
CR_SERVER_GONE_ERROR(斷線重連)。