UPDATE jl_front_order SET paystatus='1', payid='%s' WHERE oid='%s'
% 是 LIKE 模式比對的萬用字元,代表「零個或多個任意字元」。%s 只是普通字串 "%s",無特殊含義。payid 設為字面字串 "%s",oid 比對字面字串 "%s"。%s 是 格式化佔位符,表示「此處將插入一個字串參數」。%s 替換為對應變數值,並自動處理引號轉義、型別轉換。cursor.execute(
"UPDATE jl_front_order SET paystatus='1', payid=%s WHERE oid=%s",
(payid_value, oid_value)
)
-- 驅動程式自動產生:
-- UPDATE jl_front_order SET paystatus='1', payid='ABC123' WHERE oid='ORD001'
| 語言/驅動 | 佔位符 | 備註 |
|---|---|---|
| C (printf/sprintf) | %s, %d, %f | 字串格式化,非 SQL 專用 |
| Python (DB-API / psycopg2 / pymysql) | %s | 所有型別統一用 %s,驅動程式處理 |
| Java (PreparedStatement) | ? | JDBC 標準,索引從 1 開始 |
| C# (ADO.NET) | @param | 命名參數 |
| PHP (PDO) | ? 或 :name | 支援兩種風格 |
| Go (database/sql) | $1, $2... (PostgreSQL) / ? (MySQL) | 視驅動而定 |
sprintf、String.format、f-string 等字串拼接方式構建 SQL,極易導致 SQL 注入。% 或 _,請使用 ESCAPE 子句:WHERE col LIKE '%\%%' ESCAPE '\'。%s 在 SQL 字面值中無特殊含義;在程式碼構建 SQL 時為字串佔位符,代表參數綁定位置。理解語境差異,堅持參數化查詢,是防止 SQL 注入的基石。