Mysql預處理語句prepare、execute、deallocate


前言

做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的SQL預處理(Prepared)

MySQL中prepare、execute與deallocate的用法詳解

PHP MySQL 預處理語句

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM