Luché con el mismo problema durante mucho tiempo. Ejecute esta consulta tan pronto como se conecte a la base de datos y su aplicación web mostrará los caracteres tal como aparecen en phpmyadmin:
ESTABLECER NOMBRES 'utf8'
Por alguna razón, MySQL está configurado en mis sistemas para asumir que la entrada y la salida están codificadas como latin1, lo que significa que cuando envío la entrada utf8, la almacena en la base de datos incorrectamente, pero debido a que la conversión se invierte para la salida, el desorden se deshace y se muestra correctamente en el navegador (excepto cuando se usa phpmyadmin, que lo muestra fielmente). Esto solo es cierto cuando la conversión da como resultado caracteres permitidos por el juego de caracteres utilizado en el campo de la base de datos donde está almacenado, por lo que puede obtener errores a menos que detenga esta conversión con la consulta anterior.