首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 進階主題:結果集計算、資料編碼、圖片存取與常見錯誤

     編輯:MySQL 資料庫相關知識

6.8.1 利用結果集中繼資料進行統計計算

範例函式 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 檢定等複雜統計。

6.8.2 處理查詢中含特殊字元的資料: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 等值安全。

6.8.3 二進位/圖片資料的存取

  • 寫入:讀取檔案到記憶體緩衝區,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)。

6.8.4 取得資料表結構資訊

等價查詢:

DESCRIBE tbl_name;
SHOW FIELDS FROM tbl_name;

回傳結果集欄位:Field、Type、Null、Key、Default、Extra。單一欄位可用 SHOW FIELDS FROM tbl_name LIKE 'col_name'。

6.8.5 四大常見 C API 程式錯誤與對策

  1. 未初始化的連線控制代碼:區域變數 MYSQL *conn; 未初始化直接傳給 mysql_init(&conn) 導致亂寫記憶體。對策:傳 NULL 讓函式自行配置,並檢查回傳值 conn = mysql_init(NULL)。
  2. 未檢查結果集回傳值:res_set = mysql_store_result(conn) 失敗回傳 NULL,直接進迴圈會漏錯。對策:務必判斷 if (!res_set) { ... }。
  3. 忽略 NULL 欄位值:row[i] 可能為 NULL 指標,直接 printf("%s", row[i]) 在某平台會崩潰。對策:printf("%s", row[i] ? row[i] : "NULL")。
  4. 傳遞無效緩衝區給 mysql_escape_string():char *to_str; 未配置記憶體就傳入,導致踐踏記憶體。對策:預先 malloc() 或陣列配置足夠大小的緩衝區。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved