Lors du stockage du contenu d'entrée de l'utilisateur à l'aide de la base de données MySQL, en particulier des champs de texte tels que des commentaires, des surnoms et des enregistrements de chat, nous rencontrons souvent un problème: lorsque l'utilisateur entre dans une émoticône emoji ou un symbole Unicode spécial, l'enregistrement de la base de données est supprimé, ou même si la sauvegarde est réussie, elle sera brouillée ou des points de question sur la base de données ( ? ).
En effet, le jeu de caractères par défaut des bases de données MySQL (tels que UTF8 ) ne prend pas entièrement en charge les caractères Unicode de 4 octets (y compris la plupart des emoji). Pour résoudre ce problème, en plus de la configuration au niveau de la base de données, le code PHP doit également s'assurer que le jeu de caractères connecté au client est correctement défini. Cet article expliquera comment utiliser la fonction mysqli :: get_charset pour vérifier et s'assurer que le jeu de caractères de connexion est correct pour résoudre le problème que les émoticônes Unicode ne peuvent pas être stockés.
Le codage UTF8 de MySQL ne prend en charge que jusqu'à 3 octets de caractères, tandis que les emoji et certains caractères Unicode nécessitent 4 octets, donc UTF8MB4 doit être utilisé. Si le côté serveur (table de base de données, champs, connexion) ne définit pas UTF8MB4 , ces caractères ne parviendront pas à insérer, ou seront tronqués et remplacés par des points d'interrogation.
Habituellement, nous devons faire trois choses:
Le jeu de caractères pour la base de données et la table est défini sur UTF8MB4 .
Spécifiez UTF8MB4 lors de la connexion à la base de données.
Vérifiez que le jeu de caractères utilisé dans le code PHP est correct.
La classe MySQLI de PHP fournit la méthode get_charset , qui peut être utilisée pour obtenir les informations de jeu de caractères de la connexion actuelle. Avec cette fonction, nous pouvons vérifier le code si la connexion actuelle a utilisé UTF8MB4 et l'ajuster si elle ne correspond pas.
L'exemple de code est le suivant:
<?php
// Informations sur la connexion de la base de données
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
// Vérifiez si la connexion réussit
if ($mysqli->connect_errno) {
die('Échec de la connexion: ' . $mysqli->connect_error);
}
// Vérifiez le jeu de caractères de connexion actuel
$charsetInfo = $mysqli->get_charset();
echo 'Jeu de caractères de connexion actuel: ' . $charsetInfo->charset . PHP_EOL;
// Sinon utf8mb4,Puis réglé sur utf8mb4
if ($charsetInfo->charset !== 'utf8mb4') {
if (!$mysqli->set_charset('utf8mb4')) {
die('Échec du jeu de caractères: ' . $mysqli->error);
} else {
echo 'Le jeu de caractères de connexion a été défini sur utf8mb4' . PHP_EOL;
}
}
// Exemple d'insert contient Emoji Des données de
$stmt = $mysqli->prepare('INSERT INTO messages (content) VALUES (?)');
$content = 'test Emoji ?? ??';
$stmt->bind_param('s', $content);
if ($stmt->execute()) {
echo 'Insertion de données avec succès!' . PHP_EOL;
} else {
echo 'L'insertion a échoué: ' . $stmt->error . PHP_EOL;
}
$stmt->close();
$mysqli->close();
?>
Pour prendre en charge pleinement Emoji et autres caractères de 4 octets, en plus des paramètres au niveau du code, vous avez également besoin:
Paramètres de la base de données, de la table et des caractères de champ:
ALTER DATABASE your_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Paramètres de connexion: assurez-vous que la partie [mysqld] du fichier de configuration MySQL My.cnf contient:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
L'utilisation de mysqli :: get_charset peut nous aider à vérifier dynamiquement si le jeu de caractères de connexion est correct dans notre code et apporter des corrections si nécessaire. En combinant la configuration correcte des bases de données et des tables, il peut complètement résoudre le problème que les emoji Unicode ne peuvent pas être stockés. De cette façon, les utilisateurs peuvent utiliser divers emojis dans votre application avec facilité sans se soucier de la perte ou du code brouillé.