Lors de la connexion à la base de données à l'aide de l'extension MySQLI de PHP, vous voyez souvent des développeurs à l'aide de la méthode MySQLI :: set_charset pour définir le jeu de caractères. Alors, quel est le jeu de caractères par mysqli :: set_charset a une relation avec le jeu de caractères par défaut de la base de données elle-même? Y aura-t-il des conflits entre eux? Cet article expliquera en détail la relation entre les deux et les meilleures pratiques.
Le jeu de caractères par défaut de la base de données fait référence au jeu de caractères par défaut configuré par un serveur de base de données ou une instance de base de données (schéma). Par exemple, lors de la création d'une base de données MySQL, il y aura un jeu de caractères par défaut, celui commun est UTF8MB4 ou Latin1 . Si vous ne spécifiez pas de jeu de caractères lors de la création d'une table ou d'un champ, le jeu de caractères par défaut de la base de données sera hérité.
Vous pouvez afficher les caractères par défaut de la base de données actuels définis via les instructions SQL:
SHOW VARIABLES LIKE 'character_set_database';
Vous pouvez également afficher le jeu de caractères par défaut du serveur:
SHOW VARIABLES LIKE 'character_set_server';
MySQLI :: Set_Charset est une méthode de la classe PHP MySQLI qui est utilisée pour définir le jeu de caractères de la connexion actuellement connectée. Ce paramètre indique au serveur de base de données quel codage de caractères est utilisé pour analyser les données envoyées par le client et quel codage est utilisé lorsque le résultat de la requête est renvoyé.
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');
Dans le code ci-dessus, set_charset ('utf8mb4') signifie dire au serveur MySQL que les données envoyées et reçues par le client sont codées dans UTF8MB4 .
Différente portée de l'action
Le jeu de caractères par défaut de la base de données affecte le niveau de base de données, qui contrôle principalement le codage pour stocker les données par défaut.
MySQLI :: Set_Charset affecte le format de codage de communication entre le client et la base de données.
Les étapes de données affectent différentes
Le jeu de caractères par défaut de la base de données détermine le format de stockage des données dans la base de données.
MySQLI :: Set_Charset détermine le format de codage pour l'échange de données entre le client et le serveur pour s'assurer que les deux parties sont cohérentes.
Priorité et correspondance
Lorsque vous vous connectez à la base de données, si MySQLI :: set_charset n'est pas explicitement défini, la communication entre le client et le serveur utilise le jeu de caractères par défaut du serveur (généralement Latin1 , sauf si la configuration est modifiée). Cela provoquera des données brouillées lorsque le jeu de caractères par défaut de votre base de données est UTF8MB4 et que le codage de communication client est Latin1 .
Par conséquent, même si la table de base de données est UTF8MB4 , si le serveur n'utilise pas SET_CHARSET pour dire au serveur d'utiliser le même codage pour transmettre des données, les résultats de requête ou l'insertion de données peuvent provoquer des erreurs de codage.
Afin d'éviter le code brouillé en raison de jeux de caractères incohérents entre le client et le serveur, la meilleure pratique consiste à l'appeler immédiatement après la connexion à la base de données:
$mysqli->set_charset('utf8mb4');
Cela garantit:
Le codage de données transmis est cohérent avec le codage de la base de données
Le résultat de la requête est correctement codé
Évitez les problèmes de caractère exceptionnels causés par l'encodage de décalage
Le jeu de caractères par défaut de la base de données détermine le codage de stockage des données.
MySQLI :: set_charset détermine le format d'encodage pour le client pour communiquer avec le serveur.
Les deux doivent être cohérents pour s'assurer que les données sont transférées et stockées correctement.
Même si le jeu de caractères par défaut de la base de données est UTF8MB4 , vous devez explicitement définir le codage de connexion en code PHP avec set_charset .
$mysqli = new mysqli('gitbox.net', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('Échec de la connexion:' . $mysqli->connect_error);
}
// Définissez le jeu de caractères de connexion client sur utf8mb4
$mysqli->set_charset('utf8mb4');
$sql = "SELECT * FROM users";
$result = $mysqli->query($sql);
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "<br>";
}
$mysqli->close();
Cela garantit que les caractères chinois ou spéciaux récupérés de la base de données n'apparaîtront pas brouillé.