2008年5月28日 星期三

prepared statement

引用網址:
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

prepared statement

prepared statement是什麼?

Prepared statement 可以讓你在第一次執行時sql時,先設定sql敘述,讓以後相同的sql,只要帶入不同的參數,就重複執行相同的sql,而不用每次執行相同的sql時都讓伺服器耗費時間設定sql敘述。

例子:底下是一個prepared statement的實際範例。

select * from news where id=?

符號? 叫做placeholder

執行sql時,必須代入參數,取代 ? 號,才能真正執行sql敘述。

為什麼要使用prepared statement
程式中使用prepared statement 可以增進安全性及效能。

Prepared statement 把sql的邏輯語句及代入的資料分離,可以增加安全性,這樣的做法,可以避免sql隱碼的攻擊,如果使用一般的sql敘述,沒有分離sql邏輯及代入資料,你必須非常小心處理使用者輸入的資料,通常會使用一些特定的函數,跳脫單引號、雙引號、倒斜線等特殊字元。但是當使用prepared statement時,根本不用使用特殊的函數來避免sql隱碼的攻擊,你可以直接使用prepared statement,不會造成任何sql隱碼的漏洞。

效能的提升來自prepared statement的一些特殊之處,首先,prepared statement中的sql敘述只要解析一次,之後執行的sql敘述就不用再做這些解析的動作,如果你要執行同一個sql敘述很多次,就可以增加執行的速度。

效能提升的第二個原因,是prepared statement使用了binary protocol,傳統的mysql會將資料轉換成字串,再進行傳送,但使用binary protocol後,不會進行資料的轉換,而是直接將資料以原來的binary的型式進行傳送,減低了cpu的負荷,也減少了網路的使用率(轉換成字串,資料量會變大)。

使用prepared statement 的時機
prepared statement只能用在DML(insert,update,delete,replace),create table,select敘述上,額外的支援會再慢慢加上去。

Prepared statement因為要解析兩次,會比一般的sql敘述慢,如果sql敘述只會執行一次,你就要考量,是否值得使用prepared statement增強安全性,而犧牲了整體的執行速度。

如何使用prepared statement
php 5的mysqli extention支援prepared statement,其他的語言我不熟。

Mysql也有使用prepared statement的interface,不過這些interface不支援binary protocol,除非程式語言的api不支援,不然,mysql的prepared statement interface通常當做測試用。

Mysql的prepared statement的interface的用法

create table people(name,sex);

insert into people(name,sex) values('Hi','f'),('a','b');

set @query='select * from people where name=? And sex=?';

set @name='Hi';

set @sex='f';

prepare stmt from @query;

execute stmt using @name,@sex;

沒有留言: