Utilisation de SET CHARACTER SET utf8
après avoir utilisé SET NAMES utf8
réinitialisera en fait le character_set_connection
et collation_connection
à@@character_set_database
et @@collation_database
respectivement.
Le manuel déclare que
-
SET NAMES x
est équivalent àSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
et
SET CHARACTER SET x
est équivalent àSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
alors que SET collation_connection = x
exécute également en interne SET character_set_connection = <<character_set_of_collation_x>>
et SET character_set_connection = x
en interne exécute également SET collation_connection = <<default_collation_of_character_set_x
.
Donc, essentiellement, vous réinitialisez character_set_connection
à @@character_set_database
et collation_connection
à @@collation_database
. Le manuel explique l'utilisation de ces variables :
Pour résumer, la procédure d'encodage/transcodage utilisée par MySQL pour traiter la requête et ses résultats est en plusieurs étapes :
- MySQL traite la requête entrante comme étant encodée dans
character_set_client
. - MySQL transcode l'instruction de
character_set_client
danscharacter_set_connection
- lors de la comparaison des valeurs de chaîne aux valeurs de colonne, MySQL transcode la valeur de chaîne de
character_set_connection
dans le jeu de caractères de la colonne de base de données donnée et utilise le classement de colonne pour effectuer le tri et la comparaison. - MySQL construit le jeu de résultats encodé dans
character_set_results
(cela inclut les données de résultat ainsi que les métadonnées de résultat telles que les noms de colonne, etc.)
Il se peut donc qu'un SET CHARACTER SET utf8
ne serait pas suffisant pour fournir un support UTF-8 complet. Pensez à un jeu de caractères de base de données par défaut de latin1
et colonnes définies avec utf8
-charset et suivez les étapes décrites ci-dessus. Comme latin1
ne peut pas couvrir tous les caractères que UTF-8 peut couvrir, vous risquez de perdre des informations sur les caractères à l'étape 3 .
- Étape 3 : Étant donné que votre requête est encodée en UTF-8 et contient des caractères qui ne peuvent pas être représentés avec
latin1
, ces caractères seront perdus lors du transcodage depuisutf8
enlatin1
(le jeu de caractères par défaut de la base de données) faisant échouer votre requête.
Je pense donc qu'il est prudent de dire que SET NAMES ...
est la bonne façon de gérer les problèmes de jeu de caractères. Même si je pourrais ajouter que la configuration correcte de vos variables de serveur MySQL (toutes les variables requises peuvent être définies de manière statique dans votre my.cnf
) vous libère de la surcharge de performances de la requête supplémentaire requise à chaque connexion.