Doctrine - cohérence du charset

Sur un projet professionnel, j'ai été confronté à deux erreurs qui m'ont donné beaucoup de fil à retordre et je souhaite, ici, faire un retour d'expérience à ce sujet.

Contexte

Il s'agit d'un environnement ZendFramework couplé à Doctrine.
Plus précisément, on se trouve dans un service ZendAmf.
Le service en question expose une méthode permettant de changer son mot de passe.
Pour changer le mot de passe, j'utilise le code suivant :

$user = Doctrine::getTable('User')->findOneByEmail($email);
$user->password = $newPassword;
$user->save();

Et là, c'est le drame : le serveur MySQL me renvoi l'erreur suivante :
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Investigations

Le plus curieux c'est que cette erreur est systématique et que toutes les autres requêtes fonctionnent.
Je change la requête pour essayer de comprendre :

Doctrine_Query::create()
    ->update('User u')
    ->set('u.password','?',$newPassword)
    ->where('u.email = ?',$email)
    ->execute();

Cette fois ci le serveur MySQL renvoi l'erreur suivante :
SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query

En faisant la requête manuellement sur le serveur MySQL tout fonctionne ... Le mystère s'épaissit.

La solution

En farfouillant dans tous les sens sur le serveur MySQL à la recherche d'un indice, je tape :

mysql> show create database mydatabase;
 
+-----------+----------------------------------------------------------------------+
| Database  | Create Database                                                      |
+-----------+----------------------------------------------------------------------+
| mydatabase| CREATE DATABASE `mydatabase` /*!40100 DEFAULT CHARACTER SET latin1 */|
+-----------+----------------------------------------------------------------------+
 

La partie intéressante c'est : latin1. D'habitude je mets tout en utf8, donc forcément, latin1 cela m'interpelle.

De fait, en supprimant les lignes suivantes de ma configuration Doctrine, tout c'est mis à fonctionner.

$conn->setCharset("utf8");
$conn->setCollate('utf8_general_ci');

Moralité, il faut bien faire attention à sa chaine d'encodage !

postheadericon Commentaires