Maison >développement back-end >Problème PHP >Comment PHP résout-il les caractères chinois tronqués lors de l'interrogation de la base de données MySQL ?

Comment PHP résout-il les caractères chinois tronqués lors de l'interrogation de la base de données MySQL ?

Guanhui
Guanhuioriginal
2020-07-22 10:50:112885parcourir

Comment PHP résout-il les caractères chinois tronqués lors de l'interrogation de la base de données MySQL ?

Comment PHP résout-il les caractères chinois tronqués lors de l'interrogation de la base de données MySQL ?

1. Le codage par défaut de la base de données MySQL est UTF-8 ;

2 Lors de la création d'une table dans MySQL, définissez le jeu de caractères sur

.

3. Avant d'interroger des données en PHP, définissez l'encodage de la base de données sur UTF-8.

Analyse des problèmes de jeu de caractères MySQL "SET NAMES x"

Récemment reçu une formation de BBT pour construire un système de vote. Le code système n’est pas difficile, mais mon temps a été principalement consacré à l’étude des jeux de caractères et des encodages. Les problèmes d'encodage (jeu de caractères) des systèmes MySQL et Apache m'ont fait me creuser la tête et beaucoup souffrir. Les solutions à ces problèmes sur Internet sont dispersées et unilatérales. La plupart d’entre elles proposent des solutions sans expliquer pourquoi. Je vais donc résumer ce que j'ai gagné ces derniers jours pour éviter que les retardataires ne fassent à nouveau des détours. Cet article est un peu utile pour écrire du PHP (après l'avoir lu, vous saurez comment faire en sorte que votre programme PHP s'affiche normalement sur les serveurs de la plupart des fournisseurs d'espace), mais une aide plus importante réside dans l'établissement et les paramètres du serveur réseau.

Parlons d'abord du jeu de caractères de MySQL. Sous Windows, vous pouvez changer le jeu de caractères par défaut de la base de données en modifiant les deux champs

# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8

dans mon.ini. Le premier est le jeu de caractères par défaut du client et le second est le jeu de caractères par défaut du serveur. Supposons que nous définissions les deux sur utf8, puis que nous entrions "show variebles like "character_set_%";" dans le client de ligne de commande MySQL. Vous pouvez voir les caractères suivants :

character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8

L'utf8 suit notre paramètre ci-dessus. À l'heure actuelle, si nous lisons les données de la base de données via un programme PHP utilisant UTF-8, il s'agira probablement d'une chaîne de "?????" ou d'autres caractères tronqués. Après une longue recherche en ligne, la solution est simple. Après vous être connecté à la base de données, avant de lire les données, exécutez d'abord une requête "SET NAMES UTF8", c'est-à-dire

mysql_query("SET NAMES UTF8");

en PHP et elle s'affichera. normalement (tant que la base de données Les caractères dans les informations sont normaux). Pourquoi cela se produit-il ? Que fait exactement la requête « SET NAMES UTF8 » ?

Allez sur la ligne de commande MySQL et entrez "SET NAMES UTF8;", puis exécutez "show variebles like "character_set_%";" et constatez que les variables "character_set_client", "character_set_connection" et "character_set_results" étaient à l'origine latin1 Toutes les valeurs ont été modifiées en utf8. Il s'avère que ces trois variables causent des problèmes. Consultez le manuel, la phrase ci-dessus équivaut à :

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

Regardez les fonctions de ces trois variables :

Chemin de saisie des informations : client→connexion→serveur

Informations chemin de sortie : serveur → connexion → résultats.

En d’autres termes, chaque chemin doit changer l’encodage du jeu de caractères 3 fois. Prenons l'exemple de la sortie tronquée. Pour les données utf8 sur le serveur, la connexion entrante est convertie en latin1, les résultats entrants sont convertis en latin1 et la page utf-8 convertit à nouveau les résultats. Si les deux jeux de caractères sont incompatibles, comme latin1 et utf8, le processus de conversion est irréversible et destructeur. On ne peut donc pas revenir en arrière.

Mais il convient de préciser ici que l'effet de "SET NAMES UTF8" n'est que temporaire et que MySQL reviendra aux valeurs par défaut après le redémarrage.

La prochaine étape consiste à parler de la configuration de MySQL sur le serveur. Ne devons-nous pas ajouter « SET NAMES UTF8 » à chaque fois que nous lisons et écrivons dans la base de données pour garantir la cohérence du codage de la transmission des données ? Puis-je configurer MySQL pour que les trois variables soient par défaut le jeu de caractères souhaité ? Le manuel ne le dit pas et je n'ai pas trouvé de réponse en ligne. Par conséquent, du point de vue de la configuration du serveur, il n’existe aucun moyen d’omettre cette ligne de code.

Tutoriels recommandés : "PHP" "Tutoriel MySQL"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn