An integration test needs the real database or it proves nothing

A repository test against a mocked connection asserts that the code calls the methods you expected, which is a restatement of the code rather than a check on it.

// asserts that the mock returns what the mock was told to return
$pdo = $this->createStub(PDO::class);

// asserts that MySQL agrees
public function testEmailUniquenessIsCaseInsensitive(): void
{
    $this->repo->save(new Customer('[email protected]'));

    $this->expectException(DuplicateEmail::class);
    $this->repo->save(new Customer('[email protected]'));
}

Collation, unique constraints, foreign key actions, decimal rounding, timezone conversion and maximum index key length are all properties of the database, and no mock will ever tell you about any of them. Running against SQLite instead defeats the purpose entirely — different collation, different type affinity, no strict mode, foreign keys off unless asked. If the point is to test what the database does, it has to be the database.