Je vois souvent quelque chose de similaire à ceci ci-dessous dans les scripts PHP utilisant MySQL
query("SET NAMES utf8");
Je n'ai jamais eu à le faire pour aucun projet, alors j'ai quelques questions de base à ce sujet.
Il est nécessaire chaque fois que vous souhaitez envoyer au serveur des données dont les caractères ne peuvent pas être représentés en ASCII pur, tels que "ñ" ou "ö".
Cela si l'instance MySQL n'est pas configurée pour s'attendre à un codage UTF-8 par défaut à partir de connexions client (beaucoup le sont, en fonction de votre emplacement et de votre plate-forme)
Lisez http://www.joelonsoftware.com/articles/Unicode.html au cas où vous ne sachiez pas comment fonctionne Unicode.
Lire Utiliser ou non "SET NAMES" pour voir les alternatives SET NAMES et de quoi s'agit-il exactement.
De la manuel :
SET NAMES indique quel jeu de caractères le client utilisera pour envoyer SQL déclarations au serveur.
De manière plus élaborée (et une fois encore, extraite gratuitement du manuel ):
SET NAMES indique quel jeu de caractères le client utilisera pour envoyer SQL déclarations au serveur. Ainsi, SET NOMS 'cp1251' dit au serveur, “Les futurs messages entrants de cette les clients sont dans le jeu de caractères cp1251. ” Il spécifie également le jeu de caractères que le serveur doit utiliser pour l'envoi résultats au client. (Par exemple, il indique quel caractère Doit être utilisé pour les valeurs de colonne si vous utilisez une instruction SELECT.)
Bien encoder est vraiment difficile - il y a trop de couches:
La commande SQL "SET CHARSET utf8" de PHP garantira que le côté client (PHP) obtiendra les données dans utf8, quelle que soit la manière dont elles sont stockées dans la base de données. Bien sûr, ils doivent d'abord être stockés correctement.
Le codage défini pour une table/colonne ne signifie pas vraiment que les données sont dans ce codage. Si vous avez une table définie en tant que utf8
mais stockée en tant que codage différent, MySQL les traitera en tant que utf8
et vous aurez des problèmes. Ce qui signifie que vous devez résoudre ce problème en premier.
Vous devez vérifier le codage du flux de données à chaque couche.
Si vous recevez des données, par exemple, windows-1250
et souhaitez stocker dans utf-8
, puis utilisez ce SQL avant de stocker:
SET NAMES 'cp1250';
Si vous avez des données dans la base de données en tant que windows-1250
et que vous souhaitez récupérer utf8
, utilisez:
SET CHARSET 'utf8';
Ne comptez pas sur des outils trop "intelligents" pour afficher les données. Par exemple. phpMyAdmin fait (faisait quand je l'utilisais) un très mauvais encodage. Et comme il passe par toutes les couches, il est difficile de le savoir. En outre, Internet Explorer avait un comportement vraiment stupide de "deviner" l'encodage basé sur des règles étranges. Utilisez des éditeurs simples où vous pouvez changer d’encodage. De plus, je recommande MySQL Workbench.
Cette requête doit être écrite avant la requête qui crée ou met à jour des données dans la base de données. Cette requête se présente comme suit:
mysql_query("set names 'utf8'");
Notez que vous devez écrire le code que vous utilisez dans l'en-tête. Par exemple, si vous utilisez utf-8, vous l'ajoutez comme ceci dans l'en-tête, sinon un problème avec Internet Explorer apparaîtra.
si votre page ressemble à ceci
<html>
<head>
<title>page title</title>
<meta charset="UTF-8" />
</head>
<body>
<?php
mysql_query("set names 'utf8'");
$sql = "INSERT * FROM ..... ";
mysql_query($sql);
?>
</body>
<html>
La solution est
$conn->set_charset("utf8");
Au lieu de faire cela via une requête SQL, utilisez la fonction php: mysqli :: set_charset Mysqli_set_charset
Note: This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.
Consultez la section Concepts de jeux de caractères MySQL pour plus d'informations.
Merci a tous!
ne pas utiliser: query ("SET NAMES utf8"); c'est un truc d'installation et non une requête. mettre juste après une connexion commencer avec setCharset () (ou une méthode similaire)
un petit quelque chose dans le paragraphe:
statut:
Stocker et lire des données n’est pas un problème tant que mysql peut gérer les caractères. si vous regardez dans la base de données, vous verrez déjà qu’il contient de la merde (par exemple, phpmyadmin).
jusqu'à maintenant, ce n'est pas un problème! (faux mais fonctionne souvent (en europe)) ..
..si un autre client/programme ou une bibliothèque modifiée, qui fonctionne correctement, lira/sauvegardera les données. alors vous êtes dans le pétrin!
Pas seulement AOP. Si sql répond comme '????' symboles, prédéfinis par votre jeu de caractères (espérons UTF-8) vraiment recommandés:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
ou via le style de procédure mysqli_set_charset($db,"utf8")