2011-12-16 82 views
4

我需要一些動態SQL來將大量的值插入到數據庫中。等效的php的mysql_real_escape_string

INSERT INTO table1 (a,b,c,d) VALUES (1,2,3,'string with possible quotes'),.... 

因爲我想插入每批大約1,000行,所以參數不是真正的選項。
在php中,我使用mysql_ lib和mysql_real_escape_string來防止錯誤和SQL注入。

如何在Delphi中轉義字符串值?

+2

儘管防止SQL注入是傳播參數的更常見原因ered查詢,它們的另一個好處是它們可以節省數據庫引擎在每次發送時都不得不重新解析查詢。配料服務的目的相同。無論哪種方式,數據庫引擎都可以解析「INSERT ... VALUES」部分一次,然後用不同的值重新運行它。所以也許你並不需要使用數據庫的批處理擴展;參數可能會給你同樣的東西,而無需轉義所有參數或動態生成SQL。 – 2011-12-16 18:14:09

+0

@RobKennedy,好點,我定時查詢這兩種方式。這裏的主要因素是網絡流量開銷,我想這就是爲什麼一批產品加快速度。 – Johan 2011-12-16 20:41:59

回答

11

前段時間我編寫了一個delphi等價函數,遵循關於mysql_real_escape_string函數的MySql文檔。

from中的字符串被編碼爲一個轉義的SQL字符串,將 賬戶當前連接的字符集。結果是 放入並附加了一個終止空字節。 編碼的字符是「\」,「'」,「」「,NUL(ASCII 0)用於引用查詢字符串的字符轉義。 mysql_real_escape_string()引用了其他字符,使他們 更容易在日誌文件中讀取

明顯的部分..taking into account the current character set of the connection在這裏被忽略。

function StringReplaceExt(const S : string; OldPattern, NewPattern: array of string; Flags: TReplaceFlags):string; 
var 
i : integer; 
begin 
    Assert(Length(OldPattern)=(Length(NewPattern))); 
    Result:=S; 
    for i:= Low(OldPattern) to High(OldPattern) do 
    Result:=StringReplace(Result,OldPattern[i], NewPattern[i], Flags); 
end; 

function mysql_real_escape_string(const unescaped_string : string) : string; 
begin 
    Result:=StringReplaceExt(unescaped_string, 
    ['\', #39, #34, #0, #10, #13, #26], ['\\','\'#39,'\'#34,'\0','\n','\r','\Z'] , 
    [rfReplaceAll] 
); 
end;