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

MySQL 單引號處理全攻略:查詢隱式轉換、插入轉義與防注入最佳實務

     編輯:MySQL 資料庫相關知識

查詢:帶不帶單引號的差異

SQL類型行為效能
WHERE id = 1數值直接比較最快
WHERE id = '1'字串隱式轉換 CAST('1' AS UNSIGNED)略慢,可能導致索引失效

結論:**數值欄位用數值字面值**,避免隱式轉換。

插入含單引號字串:必須轉義

直接拼接 SQL 會語法錯誤:

INSERT INTO t(name) VALUES ('O'Reilly'); -- 錯誤

PHP 兩大轉義函數對比

函數適用場景缺點建議
addslashes()單位元組字串 (Latin1)多位元組 (UTF-8/GBK) 可被 0xbf27 繞過**不建議**用於中文環境
mysql_real_escape_string()考慮連線字符集,PHP 4.3.0+需已建立連線**舊專案首選**
mysqli_real_escape_string()mysqli 版本,同上需連線物件**mysqli 專案首選**
PDO::quote()PDO 統一介面較慢**現代專案首選**

最佳實務:參數化查詢 (Prepared Statement)

**根治 SQL 注入、免轉義、效能最佳**


$stmt = $pdo->prepare("INSERT INTO users(name, email) VALUES (?, ?)");
$stmt->execute(["O'Reilly", "o@example.com"]);

magic_quotes_gpc 遺毒

PHP ≤ 5.3 預設開啟,自動對 $_GET/POST/COOKIE 加斜線,**已移除於 PHP 5.4+**。舊碼遷移時務必檢查:

if (get_magic_quotes_gpc()) {
    $_POST = array_map('stripslashes', $_POST);
    $_GET  = array_map('stripslashes', $_GET);
    $_COOKIE = array_map('stripslashes', $_COOKIE);
}

mysql_escape_string vs mysql_real_escape_string

  • mysql_escape_string():不考慮連線字符集,**已棄用**
  • mysql_real_escape_string():依 mysql_set_charset() 字符集轉義,**必須在連線後呼叫**

總結決策樹

  1. **新專案**:PDO + Prepared Statement (唯一標準)
  2. **舊 mysqli**:mysqli_real_escape_string($link, $str)
  3. **極舊 mysql 擴展**:mysql_real_escape_string($str) (需先 mysql_set_charset('utf8mb4'))
  4. **禁止**:addslashes()、手動 str_replace("'", "\\'")、拼接 SQL

結語

單引號處理的核心是**拒絕拼接 SQL**。參數化查詢同時解決轉義、注入、效能三大問題,是現代資料庫開發的鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved