settare la connessione funziona se nella tabella i caratteri sono memorizzati correttamente.

l'ascii utf8 e' multibyte latin1 e' single byte. una volta memorizzato un carattere che latin1 interpreta single byte mentre in utf8 doppio byte l'errore rimane perche' nel db sara' un carattere buffo, e quando verra' letto con utf8 continuera' ad essere buffo, mentre se letto con latin1 sara' buffo leggermente differente ma sempre buffo.

In solido se tu hai una tabella con charset latin1 non puoi semplicemente cambiare la tabella in utf8 con un alter table, ma devi fare un backup con latin1 (il file ottenuto sara' ANSI) e reinserirla come utf8.

tieni presente che ci sono tre livelli di charset per questo caso: tabella - connessione - client

mysql_query('set names latin1|utf8') setta soltanto la connessione e forse il client ma non credo/ricordo.

Una volta introdotto l'errore non lo togli piu'. potresti fare il backup, metterlo su un editor e cambiare il buffo con il carattere reale con trova e sostituisci e poi reinserire i dati corretti.

Non per nulla gli editor online tipo JCK trasformano tutto con htmlentities in caratteri monobyte buoni per tutti i charset.