Firedac TFDquery.RowsAffected - returns 1 什么时候应该 return 0

Firedac TFDquery.RowsAffected - returns 1 when should return 0

我有一个 table 'EMAIL' 具有唯一字段 'addr'。当我从 mysql 控制台(通过 Putty)进行查询时,它 returns '0 行受影响 ' (因为 'id' 实际上没有改变),但 FIREDAC 始终 returns 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)

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;

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

对于 MySQL 数据库,在 UPDATE 查询的情况下,受影响的行数(由 mysql_affected_rows() 返回)取决于 CLIENT_FOUND_ROWS 标志。

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

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

默认情况下,CLIENT_FOUND_ROWS 被禁用,但 FireDAC 在调用 mysql_real_connect() 时启用它。