Atrevo-me a dizer que é um bug. Encontrei dois tickets relevantes:
- Bug #63812 :PDO aciona aviso(s) independente da estratégia de tratamento de erros, arquivado em 2012 para PHP/5.3.19
- Bug #74401 :Aviso de gatilho PDO já definido exceção de lançamento, arquivado em 2017 para PHP/7.0.17
De qualquer forma, eles ainda estão abertos e não está totalmente claro se são problemas válidos (embora eu suspeite que sejam). Não parece ser uma decisão de design porque outros erros do MySQL não acionam ambos, aviso e exceção:
$connection = new PDO('mysql:host=127.0.0.1;dbname=test', 'test', 'test',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING]);
$connection->query('SELECT * FROM foo');
$connection = new PDO('mysql:host=127.0.0.1;dbname=test', 'test', 'test',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$connection->query('SELECT * FROM foo');