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

MySQL 查詢資料編碼詳解:mysql_escape_string() 實戰

     編輯:MySQL 資料庫相關知識

為何需要資料編碼?

SQL 語句以字串拼接方式構建時,資料中的單引號(')、雙引號(")、反斜線(\)、空字元、換行符、Control-Z 等會被伺服器誤判為字串結束或控制字元,導致語法錯誤或 SQL 注入漏洞。典型案例:name = "O'Malley" 產生 ... WHERE name = 'O'Malley',引號不匹配。

解決方案:mysql_escape_string()

函式原型:

unsigned long mysql_escape_string(char *to_str, const char *from_str, unsigned long from_len);
  • from_str:來源資料緩衝區(可含二進位資料,長度由 from_len 指定,不可視為 C 字串)。
  • to_str:預先配置的目標緩衝區,長度至少 (from_len * 2) + 1 位元組。
  • 回傳值:編碼後實際長度 to_len(不含結束 null)。

編碼規則:特殊字元轉為反斜線開頭的雙字元序列(\0、\'、\"、\\、\n、\r、\Z)。編碼後結果以 null 結束,方便 strcpy/strlen 使用。

何時必須呼叫?

最安全策略:永遠呼叫。 唯一例外是你確定資料格式純淨(如經正則驗證的純數字電話、純字母代碼)。否則任何外部輸入(使用者表單、檔案匯入、API 回傳)都應先 escape 再入查詢。

實戰範例:安全構建 SELECT

char query[1024];
char safe_name[256];
mysql_escape_string(safe_name, user_input, strlen(user_input));
snprintf(query, sizeof(query), "SELECT * FROM members WHERE name = '%s'", safe_name);
mysql_query(conn, query);

同樣適用於 INSERT、UPDATE 的 VALUES 子句。

延伸應用:二進位資料(圖片)寫入

讀取圖片檔 → mysql_escape_string() 編碼 → 嵌入 INSERT INTO images (id, img) VALUES (1, '...')。注意:

  • 編碼後字串長度約為原始 2 倍,大檔案需動態配置大緩衝區。
  • 讀取時用 mysql_fetch_lengths() 取得真實長度,視為二進位 blob 處理。

欄位型別建議 BLOB 系列,避免字元集轉換損壞資料。

常見誤區提醒

  • 以為 mysql_real_escape_string() 需連線控制代碼:舊版 mysql_escape_string() 不需連線,新版 mysql_real_escape_string(conn, ...) 支援多位元組字元集,實務上建議改用後者。
  • 緩衝區太小:導致緩衝區溢位,務必依公式配置。
  • 雙重編碼:若資料已編碼(如從資料庫讀出再存入),不可再次 escape。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved