Toutes ces méthodes devrait travail, sauf dans certaines circonstances particulières. Par exemple, si vous exécutez un serveur web localement sur une machine Windows avec php < 5.3.1, seule une requête 'manuelle' $db->query("SET NAMES 'utf8'") ; avant votre requête réelle fonctionnera. Toute autre méthode essayant d'utiliser MYSQL_ATTR_INIT_COMMAND échouera.
Voici ce que j'ai appris aujourd'hui, en me débattant avec ce même problème :
-
Vous ne pouvez pas faire référence à PDO::MYSQL_ATTR_INIT_COMMAND dans certains environnements (le mien, par exemple, je ne sais pas). Vous devez explicitement utiliser 1002 à la place
-
Avec Zend Framework 1.11 ( peut-être depuis 1.8, à confirmer ), vous n'avez pas besoin de définir database.params.driver_options.1002 = "SET NAMES utf8" dans votre config.ini : resources.db.params.charset = "utf8" sera suffisant pour que Zend_Db_Adapter_Pdo_Mysql le fasse pour vous.
-
Sous Windows, vous devez disposer de php >= 5.3.1 pour que la commande MYSQL_ATTR_INIT_COMMAND fonctionne.
-
Si vous remplacez votre version de php par 5.3.1 ou plus (j'ai également testé 5.3.3), vous devez vous assurer que vous définissez une valeur pour pdo_mysql.default_socket dans votre php.ini. La valeur vide par défaut ne fonctionnera pas (à confirmer : j'ai lu quelque chose à ce sujet mais je n'ai pas pris la peine d'essayer sans cela après avoir découvert le point 5).
-
Vous devez également vous assurer que vous avez '127.0.0.1 localhost' dans votre système d'exploitation Windows. \system32\drivers\etc\hosts fichier système caché (ce qui n'était pas un problème pour php 5.3.0)
Avec tout cela en tête, vous devriez pouvoir vous épargner une journée de recherche sur Internet et garder certains de vos cheveux !)