2011-12-16 4 views
4

У меня есть потребность в некотором динамическом SQL для INSERT большого количества значений в базе данных.Эквивалент php mysql_real_escape_string

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

Поскольку я хочу вставить около 1000 рядов за партию, параметры на самом деле не являются опцией.
В php я бы использовал mysql_ lib и mysql_real_escape_string, чтобы предотвратить ошибки и SQL-инъекции.

Как избежать значений строк в Delphi?

+2

Хотя защита от SQL-инъекции является более распространенной причиной использования параметра еще одно преимущество заключается в том, что они сохраняют механизм БД от необходимости повторного анализа запроса каждый раз, когда он отправляется. Те же цели предназначены для дозирования. В любом случае, механизм БД может анализировать часть «INSERT ... VALUES» только один раз и повторно запускать ее с разными значениями. Поэтому, возможно, вам не нужно использовать расширение для вашей базы данных. параметры могут дать вам то же самое, не избегая всех ваших параметров или динамически генерируя SQL. –

+0

@RobKennedy, Хорошо, я приурочил запрос в обоих направлениях. Основным фактором здесь был сетевой трафик, я думаю, именно поэтому пакет работал быстрее. – Johan

ответ

11

Когда-то я написал эквивалентную функцию delphi, следуя документации MySql о функции mysql_real_escape_string.

Строка from from кодируется в escape-строку SQL, принимая в качестве значения текущий набор символов соединения. В результате добавляется , и добавляется завершающий нулевой байт. Символы кодируются «\», «'», «" », NUL (ASCII 0),« \ n »,« \ r »и Control + Z. Строго говоря, MySQL требует только этого обратного слэша и цитаты символ, используемый процитировать строку в запросе экранировать. 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; 
+0

Благодаря миллиону, текущий набор символов UTF-8. Но я использую ansi-string для ввода данных, потому что это происходит из старой базы данных доступа. Я просто хочу быть в безопасности и делать правильные вещи, поэтому этот код будет очень хорош. – Johan

+0

Рад помочь вам – RRUZ

Смежные вопросы