web-dev-qa-db-fra.com

SET NOMS utf8 dans MySQL?

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. 

  1. Est-ce quelque chose qui est fait avec PDO seulement?
  2. Si ce n'est pas une chose spécifique au PDO, alors quel est le but de le faire? Je me rends compte que cela définit l'encodage pour mysql mais je veux dire, je n'ai jamais eu à l'utiliser, alors pourquoi voudrais-je l'utiliser? 
100
JasonDavis

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.

69
Vinko Vrsalovic

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.)

42
karim79

Bien encoder est vraiment difficile - il y a trop de couches:

  • Navigateur
  • Page
  • PHP
  • MySQL

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.

Définition DDL vs données réelles

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.

Que vérifier

Vous devez vérifier le codage du flux de données à chaque couche.

  • Vérifiez les en-têtes HTTP, les en-têtes.
  • Vérifiez ce qui est vraiment envoyé dans le corps de la demande.
  • N'oubliez pas que MySQL utilise l'encodage presque partout:
    • Base de données
    • Les tables
    • Les colonnes
    • Serveur dans son ensemble
    • Client
      Assurez-vous qu'il y en a un partout.

Conversion

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';

Dernière note:

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.

27
Ondra Žižka

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>
17
usama sulaiman

La solution est 

 $conn->set_charset("utf8");
8
nurp

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.

de http://www.php.net/manual/en/mysqli.set-charset.php

5
user1783273

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: 

  • serveur mysql par défaut parle latin1
  • votre application de trou est dans utf8
  • la connexion est faite sans extra (donc: latin1) (pas de SET NAMES utf8 ..., pas de méthode/fonction set_charset ())

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!

1
user3162905

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")

0
dmitry_podyachev