Pierwsze spojrzenie na http://www.nicknettleton.com/ zine/php/php-utf-8-cheatsheet Myślę, że brakuje jednej ważnej rzeczy (być może przeoczyłem tę). W zależności od instalacji i/lub konfiguracji MySQL musisz ustawić kodowanie połączenia, aby MySQL wiedział, jakiego kodowania oczekujesz po stronie klienta (czyli klienta strony połączenia MySQL, którą powinien być skrypt PHP). Możesz to zrobić ręcznie, wydając
SET NAMES utf8
zapytanie przed jakimkolwiek innym zapytaniem wysłanym do serwera MySQL.
Jeśli używasz PDO po stronie PHP, możesz skonfigurować połączenie, aby automatycznie wysyłało to zapytanie przy każdym (ponownym) połączeniu za pomocą
$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");
podczas inicjowania połączenia z bazą danych.