Al primo sguardo a http://www.nicknettleton.com/ zine/php/php-utf-8-cheatsheet Penso che manchi una cosa importante (forse l'ho trascurata). A seconda dell'installazione e/o della configurazione di MySQL, devi impostare la codifica della connessione in modo che MySQL sappia quale codifica ti aspetti dal lato client (ovvero il client lato della connessione MySQL, che dovrebbe essere lo script PHP). Puoi farlo emettendo manualmente un
SET NAMES utf8
query prima di qualsiasi altra query inviata al server MySQL.
Se stai utilizzando PDO sul lato PHP, puoi impostare la connessione per emettere automaticamente questa query ad ogni (ri)connessione utilizzando
$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");
durante l'inizializzazione della connessione db.