Ho lottato con lo stesso problema per molto tempo. Esegui questa query non appena ti connetti al database e la tua applicazione web visualizzerà i caratteri così come appaiono in phpmyadmin:
IMPOSTA I NOMI 'utf8'
Per qualche motivo MySQL è impostato sui miei sistemi per presupporre che l'input e l'output siano codificati come latin1, il che significa che quando lo invio input utf8 lo memorizza nel database in modo errato, ma poiché la conversione è invertita per l'output, il pasticcio viene annullato e viene visualizzato correttamente nel browser (tranne quando si utilizza phpmyadmin, che lo visualizza fedelmente). Questo è vero solo quando la conversione genera caratteri consentiti dal set di caratteri utilizzato nel campo del database in cui è archiviato, quindi puoi ottenere errori a meno che non interrompi questa conversione con la query precedente.