範例函式 summary_stats(res_set, col_idx) 展示如何:
col_idx < mysql_num_fields(res_set))。mysql_fetch_field_direct() 取得 MYSQL_FIELD,檢查 type 是否為數值型(IS_NUM())。mysql_data_seek(res_set, 0) 重置游標,配合 mysql_store_result() 的緩存結果集可重複掃描。sum、min、max、計算 avg,統計 NULL 個數。此模式可延伸至迴歸分析、t 檢定等複雜統計。
mysql_escape_string()當資料含單引號、雙引號、反斜線、空字元、換行符、Control-Z 等,直接拼接 SQL 會導致語法錯誤或注入風險。解決方案:
mysql_escape_string(to_str, from_str, from_len),將特殊字元轉為反斜線雙字元序列(如 \'、\\、\0)。to_str 須預先配置,長度至少 (from_len * 2) + 1。to_len(不含結束 null)。範例重寫 SELECT * FROM t WHERE name = '...',先 escape 再拼接,確保 O'Malley 等值安全。
mysql_escape_string() 編碼後嵌入 INSERT INTO images (id, data) VALUES (..., '...')。注意緩衝區大小限制(範例 100K),實務上應依檔案大小動態配置。mysql_fetch_row() 回傳的 MYSQL_ROW 中二進位資料保持原貌,長度由 mysql_fetch_lengths() 取得,必視為計數字串而非 C 字串(不可用 strlen 或 printf("%s"))。欄位型別建議用 BLOB 家族(TINYBLOB~LONGBLOB)。
等價查詢:
DESCRIBE tbl_name;
SHOW FIELDS FROM tbl_name;
回傳結果集欄位:Field、Type、Null、Key、Default、Extra。單一欄位可用 SHOW FIELDS FROM tbl_name LIKE 'col_name'。
MYSQL *conn; 未初始化直接傳給 mysql_init(&conn) 導致亂寫記憶體。對策:傳 NULL 讓函式自行配置,並檢查回傳值 conn = mysql_init(NULL)。res_set = mysql_store_result(conn) 失敗回傳 NULL,直接進迴圈會漏錯。對策:務必判斷 if (!res_set) { ... }。NULL 欄位值:row[i] 可能為 NULL 指標,直接 printf("%s", row[i]) 在某平台會崩潰。對策:printf("%s", row[i] ? row[i] : "NULL")。mysql_escape_string():char *to_str; 未配置記憶體就傳入,導致踐踏記憶體。對策:預先 malloc() 或陣列配置足夠大小的緩衝區。