phpMyAdmin
 sql >> Base de données >  >> Database Tools >> phpMyAdmin

MySQL génère un encodage occidental dans un fichier PHP UTF-8

Utilisez mysqli_set_charset pour changer l'encodage client en UTF-8 juste après votre connexion :

$mysqli->set_charset("utf8");

L'encodage client correspond à ce que MySql attend de votre entrée (par exemple, lorsque vous insérez du texte fourni par l'utilisateur dans une requête de recherche) et à ce qu'il vous donne les résultats (il doit donc correspondre à votre encodage de sortie pour que echo pour afficher les choses correctement).

Vous devez le faire correspondre à l'encodage de votre page Web pour tenir compte des deux scénarios ci-dessus et l'encodage du fichier source PHP (afin que les parties codées en dur de vos requêtes soient interprétées correctement).

Mise à jour :comment convertir les données insérées à l'aide de latin-1 en utf-8

En ce qui concerne les données qui ont déjà été insérées en utilisant le mauvais codage de connexion, il existe une solution pratique pour résoudre le problème. Pour chaque colonne contenant ce type de données, vous devez :

ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;

Les espaces réservés table_name , column_name et existing_column_type doit être remplacé à chaque fois par les valeurs correctes de votre base de données.

Ce que cela fait est

  1. Dites à MySql qu'il doit stocker des données dans cette colonne en latin1. Ce jeu de caractères ne contient qu'un petit sous-ensemble d'utf8, donc en général, cette conversion implique une perte de données, mais dans ce scénario spécifique, les données ont déjà été interprétées comme latin1 en entrée, il n'y aura donc aucun effet secondaire. Cependant, MySql convertira en interne la représentation en octets de vos données pour qu'elle corresponde à ce qui a été envoyé à l'origine par PHP.
  2. Convertir la colonne en un type binaire (BLOB ) qui n'a pas d'informations de codage associées. À ce stade, la colonne contiendra des octets bruts qui sont une chaîne de caractères utf8 appropriée.
  3. Convertissez la colonne dans son type de caractère précédent, en indiquant à MySql que les octets bruts doivent être considérés comme étant en encodage utf8.

AVERTISSEMENT :Vous ne pouvez utiliser cette approche aveugle que si la colonne en question contient seulement données mal insérées. Toutes les données correctement insérées seront tronquées à la première occurrence d'un caractère non ASCII !

C'est donc une bonne idée de le faire maintenant, avant que le correctif côté PHP n'entre en vigueur.