Pour être certain que tous les éléments sont en UTF-8, il faut vérifier les paramètres suivants:

Page HTML ou PHP

[HTML]
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Content Type

[CODE]
Content-Type    text/html; charset=utf-8

MYSQL

Pour avoir vos tables SQL au format UTF-8, il faut choisir un interclassement ou collation.
Je vous recommande d'utiliser utf8_general_ci ou utf8_unicode_ci pour être certain d'avoir le bon encodage et préparer convenablement votre base de données.

Une fois votre base de données prête, il faut vous connectez à celle-ci depuis votre application ou site internet en utilisant le driver PDO.
Dans certains cas, MYSQL ne supportera pas convenablement l'UTF-8 et insérera du contenu avec des caractères ASCII ce qui peut dans l'évolution de votre site internet poser pas mal de problèmes.

Imaginons que votre base de données contient des champs titres avec des caractères accentués, vous souhaitez faire un moteur de recherche avec LIKE mais les caractères accentués ressemblent à "é".

Vous vous dites ce n'est pas grave, mon navigateur les interprète convenablement !!!
Vous mettez en place une requête SQL avec LIKE et vous testez la recherche avec et sans accent, le problème se révèle enfin car suivant la recherche le résultat est dans pas mal de cas NULL.

Pourquoi les résultats ne sont pas corrects ?
Une recherche sur le mot "catégorie" et "catégorie" n'est pas du tout la même chose pourtant LIKE est insensible à la casse et supporte très bien les caractères accentués !
Quelle solution pour que mes insertions soient réalisées avec de véritable accent ?

  1. Je modifie chaque ligne à la main dans la base de données pour y insérer des accents (ce n'est vraiment pas conseillé)
  2. Je modifie le comportement de la connexion entre PHP et MYSQL par l'intermédiaire de PDO

Comment modifier l'encodage de la connexion ?

Avec MYSQL sans PDO:

[PHP]
mysql_query("SET NAMES 'utf8'");

Pour rappel on se connecte à PDO de cette manière :

[PHP]
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

Il existe deux méthodes pour forcer l'encodage de PDO, la première fonctionne aussi bien avec MYSQL que POSTGRESQL.

[PHP]
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$dbh->exec("SET CHARACTER SET utf8");

La deuxième méthode est uniquement disponible avec MYSQL:

[PHP]
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
           PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);