Delphi Firedac TFDquery.RowsAffected-在应返回0时返回1

Delphi Firedac TFDquery.RowsAffected-在应返回0时返回1,delphi,firedac,Delphi,Firedac,我有一个带有唯一字段“addr”的表“EMAIL”。当我从mysql控制台(通过Putty)进行查询时,它返回“0受影响的行””(因为“id”实际上没有改变),但FIREDAC总是返回rowsAffected=1(如果有更多字段,则返回2或3)。为什么会这样,我该如何解决 +----+-------+------+------+ | id | owner | addr | pass | +----+-------+------+------+ | 1 | NULL | test | NULL

我有一个带有唯一字段“addr”的表“EMAIL”。当我从mysql控制台(通过Putty)进行查询时,它返回“0受影响的行””(因为“id”实际上没有改变),但FIREDAC总是返回rowsAffected=1(如果有更多字段,则返回2或3)。为什么会这样,我该如何解决

+----+-------+------+------+
| id | owner | addr | pass |
+----+-------+------+------+
|  1 |  NULL | test | NULL |
+----+-------+------+------+
mysql> update EMAIL set id=last_insert_id(id);
Query OK, 0 rows affected (0.00 sec)                        // 0 affected!
Rows matched: 1  Changed: 0  Warnings: 0
FIREDAC(FDconnection+FDquery)


[已解决!]我编辑了'FireDAC.Phys.MySQL'的源代码,第471行,注释掉了'CLIENT\u FOUND\u ROWS'标志(感谢@Olivier)

对于MySQL数据库,在
UPDATE
查询的情况下,受影响的行数(返回的行数)取决于
CLIENT\u FOUND\u ROWS
标志

如果禁用该标志,则只考虑实际修改的记录

如果启用该标志,则会考虑所有已处理的记录(无论是否修改)


默认情况下,
CLIENT\u FOUND\u ROWS
处于禁用状态,但FireDAC在调用时会启用它。

此q需要添加一个,因为FireDAC.Comp.CLIENT.Pas包含不少于22个对RowsAffected的赋值,读者需要知道其中涉及到哪一个。@Sami事实上,行为取决于
CLIENT\u FOUND\u ROWS
标志(如前所述)。如果FireDAC启用
客户端查找行
,它确实解释了观察到的行为。该标志作为的最后一个参数传递。您可以查看FireDAC的源代码,了解调用是如何完成的。“伙计,感谢您的帮助。”我同意,@Olivier在他的评论中经常有一些很好的见解,人们应该始终注意到这些。
procedure test;
var conn:TFDCONNECTION;
    query:TFDQUERY;
begin;

conn:=TFDCONNECTION.Create(nil);
query:=TFDQUERY.Create(nil);
query.Connection:=conn;

conn.Params.Add('DriverID=MySQL');
conn.Params.Add('CharacterSet=utf8');
conn.Params.Add('Server=192.168.56.11'); //ubuntu server, v 14.14 5.7.30
conn.Params.Add('User_Name=root');
conn.Params.Add('Password=mypass');
conn.Params.Add('Database=MYDB');
conn.Params.Add('Port=3306');

query.SQL.Text:='update EMAIL set id=last_insert_id(id)';
query.ExecSQL;

//never shows '0', always thinks all the rows have been updated!
showmessage(inttostr( query.RowsAffected ));

query.Close;

conn.Free;
query.Free;
end;