Mysql
 sql >> Base de données >  >> RDS >> Mysql

SET CHARACTER SET utf8 est-il nécessaire ?

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 :

  1. MySQL traite la requête entrante comme étant encodée dans character_set_client .
  2. MySQL transcode l'instruction de character_set_client dans character_set_connection
  3. 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.
  4. 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 depuis utf8 en latin1 (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.