前言
做CTF題的時候遇到的所以參考資料學習一波。。。。
MySQL的SQL預處理(Prepared)
一、SQL 語句的執行處理
1、即時 SQL
一條 SQL 在 DB 接收到最終執行完畢返回,大致的過程如下:
1. 詞法和語義解析;
2. 優化 SQL 語句,制定執行計划;
3. 執行並返回結果;
如上,一條 SQL 直接是走流程處理,一次編譯,單次運行,此類普通語句被稱作 Immediate Statements (即時 SQL)。
2、預處理 SQL
但是,絕大多數情況下,某需求某一條 SQL 語句可能會被反復調用執行,或者每次執行的時候只有個別的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要經過上面的詞法語義解析、語句優化、制定執行計划等,則效率就明顯不行了。
所謂預編譯語句就是將此類 SQL 語句中的值用占位符替代,可以視為將 SQL 語句模板化或者說參數化,一般稱這類語句叫Prepared Statements。
預編譯語句的優勢在於歸納為:一次編譯、多次運行,省去了解析優化等過程;此外預編譯語句能防止 SQL 注入。
二、Prepared SQL Statement Syntax
MySQL 官方將 prepare、execute、deallocate 統稱為 PREPARE STATEMENT。翻譯也就習慣的稱其為預處理語句。
MySQL 預處理語句的支持版本較早,所以我們目前普遍使用的 MySQL 版本都是支持這一語法的。
-
預處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執行)。
-
綁定參數減少了服務器帶寬,你只需要發送查詢的參數,而不是整個語句。
-
預處理語句針對SQL注入是非常有用的,因為參數值發送后使用不同的協議,保證了數據的合法性。
PREPARE:准備一條SQL語句,並分配給這條SQL語句一個名字供之后調用 EXECUTE :執行命令 DEALLOCATE PREPARE:釋放命令
1.簡單使用
PREPARE xiaohua FROM 'SELECT ?+?'; SET @a=1,@b=10; EXECUTE xiaohua USING @a,@b; DEALLOCATE PREPARE xiaohua;
執行結果 :
參考學習
MySQL中prepare、execute與deallocate的用法詳解