Si, tu as besoin du SET NAMES
Le SET NAMES ne concerne pas le codage des tables, il concerne le codage utilisé pour le dialogue entre ton script et mysql. Il faut bien comprendre cette distinction pour comprendre le problème.
Le SET NAMES UTF8 signifie que les données que tu envoies à mysql sont codées en utf8, et que quand tu l'interroges, tu veux des résultats en utf8. Que les tables soient en iso ou en utf8 est une autre question : mysql fait les traductions si nécessaire (et dans la mesure du possible, car il n'y a pas de correspondance directe entre les deux encodages)
Sans ce SET NAMES, mysql croit que tu lui envoies les infos en iso. Si tu lui envoies un é en iso (code E9) dans une table iso, il va y écrire E9. Si c'est une table utf-8, il va traduire ce E9 en utf8 -> C3 A9. Quand tu reliras avec ton script, il fera la traduction inverse et tout baigne encore.
Toujours sans cet SET NAMES, si tu écris un é déjà codé en utf8, c'est à dire C3 A9, vers une table utf8, mysql croit toujours que tu lui parles en iso. Il va donc traduire le C3 et utf8 -> C3 83 puis le A9 -> C2 A9. Quand tu le reliras, il fera la traduction inverse et tu auras l'impression que ça baigne. Mais phpmyadmin lui, te montrera é car c'est bien comme ça que s'interprète C3 83 C2 A9 en utf8.
Avec le SET NAMES UTF8 , mysql n'a besoin de faire aucune traduction pour lire ou écrire dans une table utf8. D'où économie de ressources d'une part (les traductions sont coûteuses) et cohérence garantie entre ton script (en utf8 lui aussi), mysql et phpmyadmin.