MySQL への単純な INSERT であるクエリがあります。値をクエリに追加するために使用DBQuery.Params
すると、MySQL 側で ??????(または E?? E?E???) を取得します (SELECT を実行すると、この結果も得られます)。しかし、クエリに値を直接追加すると、すべて問題ありません。
問題のある方法:
procedure TfrmMain.Button1Click(Sender: TObject);
var
Title: widestring;
begin
Title:='سلام';
DBQuery.SQL.Text:=
'INSERT INTO tblintersection '+
'( '+
' Address, '+
' Title, '+
' InsertDate '+
') '+
'VALUES '+
'( '+
' :Address /*Address*/, '+
' :Title /*Title*/, '+
' NOW() /*InsertDate*/ '+
')';
DBQuery.Params.ParamValues['Address']:='100';
DBQuery.Params.ParamValues['Title']:=Title;
DBQuery.ExecSQL;
end;
に変更:Title
すると"'+Title+'"
(そしてそのパラメーターも削除すると)問題は解決しますが、パラメーターを使用して注入などの問題を回避したいと考えています。
DB CharacterSet は Latin1 です。しかし、クエリ内で値を直接使用した場合はすべて問題ありません
私もこれをテストしましたが、結果はありません:
DBQuery.ParamByName('Title').DataType:= ftWideString;
DBQuery.ParamByName('Title').Value:= Title;
私はこれを使用Zeos
ZSqlMonitor
してログを保存しました:
2013-09-25 11:18:24 cat: Execute, proto: mysql-5, msg: INSERT INTO tblintersection ( Address, Title, InsertDate ) VALUES ( 'sd45' , '? ??? ??? ???' , NOW() )
パラメータを使用してこの問題を回避するにはどうすればよいですか?