| 結構體 | 用途 |
|---|---|
MYSQL | 連線控制代碼,幾乎所有 API 函數的第一參數 |
MYSQL_RES | 結果集合(SELECT/SHOW/DESCRIBE/EXPLAIN 回傳) |
MYSQL_ROW | 單行資料,實為 char **(含二進位資料時不可視為 C 字串) |
MYSQL_FIELD | 欄位中繼資料:名稱、類型、長度、旗標、小數位等 |
MYSQL_FIELD_OFFSET | 欄位位移(0 基礎),供 mysql_field_seek() 使用 |
my_ulonglong | 64 位無符號整數,用於行數、影響行數、自增 ID |
name、table、def (預設值)type:FIELD_TYPE_TINY、_LONG、_LONGLONG、_STRING、_BLOB、_DATE 等length (定義寬度)、max_length (結果集實際最大寬度)flags:NOT_NULL_FLAG、PRI_KEY_FLAG、AUTO_INCREMENT_FLAG、UNSIGNED_FLAG 等decimals:數值欄位小數位數MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, "host", "user", "pass", "db", 0, NULL, 0)) {
fprintf(stderr, "Connect failed: %s\n", mysql_error(&mysql));
return 1;
}
/* 執行查詢 */
if (mysql_query(&mysql, "SELECT * FROM users")) {
fprintf(stderr, "Query failed: %s\n", mysql_error(&mysql));
return 1;
}
/* 取得完整結果集 (緩衝模式) */
MYSQL_RES *res = mysql_store_result(&mysql);
if (res) {
MYSQL_ROW row;
while ((row = mysql_fetch_row(res))) {
unsigned long *lengths = mysql_fetch_lengths(res);
for (unsigned int i = 0; i < mysql_num_fields(res); i++) {
printf("[%.*s] ", (int)lengths[i], row[i] ? row[i] : "NULL");
}
puts("");
}
mysql_free_result(res);
}
/* 或使用非緩衝模式 (逐行拉取,省記憶體) */
MYSQL_RES *res = mysql_use_result(&mysql);
while ((row = mysql_fetch_row(res))) { ... }
mysql_free_result(res);
mysql_close(&mysql);
mysql_init()、mysql_real_connect()、mysql_close()mysql_change_user()、mysql_ping() (斷線重連)mysql_options():MYSQL_OPT_CONNECT_TIMEOUT、MYSQL_READ_DEFAULT_FILE、MYSQL_OPT_COMPRESS 等mysql_query() (NUL 終結字串)、mysql_real_query() (含長度,支援二進位)mysql_store_result()、mysql_fetch_row()、mysql_data_seek()、mysql_num_rows()mysql_use_result()、mysql_fetch_row() (不可隨機存取、不可預知行數)mysql_fetch_field(s)()、mysql_fetch_lengths()、mysql_field_seek/tell()、mysql_free_result()mysql_affected_rows()、mysql_insert_id()、mysql_field_count()mysql_errno()、mysql_error()、mysql_sqlstate()mysql_get_server_info()、mysql_get_client_info()、mysql_get_host_info()mysql_list_dbs/tables/fields/processes()mysql_kill()、mysql_shutdown()、mysql_reload()、mysql_dump_debug_info()if (mysql_query(&mysql, sql)) {
fprintf(stderr, "Error %u: %s\n", mysql_errno(&mysql), mysql_error(&mysql));
/* 依錯誤碼決定重試/告警/退出 */
}
永遠檢查回傳值:指標類函數非 NULL 表成功,整數類函數 0 表成功。
--with-thread-safe-client;mysql_query;mysql_store_result 取得的 MYSQL_RES 可多線程唯讀;mysql_use_result 時,結果集未關閉前不可在同連線執行其他查詢。