mysql_client_found_rows=0

DBD::mysql で insert on duplicate をした際に $sth->rows の返す結果が

  • insert されなかった場合: 1
  • insert された場合: 1
  • update された場合: 2

となっていて mysql に繋いで直接コマンドを打った場合の affected rows と違って困るなぁと思っていたのですが

How to obtain the number of rows affected by a statement in MySQL - O'Reilly Answers

こういうことらしく matched rows を返すとのこと。

mysql_client_found_rows=0

とすることで、

  • insert されなかった場合: 0
  • insert された場合: 1
  • update された場合: 2

となってしたいことの要件を満たしてくれました。