Les paramètres de connexion MySQL pourraient être en cause ici. Exécutez cette commande MySQL lorsque vous vous connectez à la base de données depuis PHP, avant d'exécuter toute autre commande SQL :
SET names 'utf8';
Cela devrait définir l'encodage de la connexion sur UTF-8. Comme vous le dites, la page et la base de données sont déjà en UTF-8 (cela devrait également signifier que la page envoie Content-Type: text/html; charset=utf-8
); la connexion elle-même peut accidentellement avoir un encodage différent par défaut :(