IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Quand insérer : mysql_query("SET NAMES 'utf8'");


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut Quand insérer : mysql_query("SET NAMES 'utf8'");
    Bonjour,

    à quel moment faut-il insérer :
    mysql_query("SET NAMES 'utf8'");
    pour que cela soit efficace ?

    Merci !
    Paul

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    au début d'une session avec un client UTF8.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Oui, ou juste avant une requête spécifique, tu n'es pas obligé de le faire pour toutes tes requêtes si tu n'en a pas besoin.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par vallica
    Oui, ou juste avant une requête spécifique, tu n'es pas obligé de le faire pour toutes tes requêtes si tu n'en a pas besoin.
    C'est valable pour l'ensemble de la session. Donc si je suis ton principe, le scénario serait le suivant :

    - j'ouvre ma session
    - j'envoie un premier paquet de requêtes avec un mauvais jeu de caractères, mais je considère que ce n'est pas grave pour celles-là
    - je fais mon SET NAMES UTF8
    - j'envoie ma "requête spécifique"
    - je continue le reste de ma session en UTF8

    Franchement, je ne vois pas l'intérêt...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Bonjour,

    La semaine dernière j'ai eu à faire un script dans lequel je devais importer en UTF-8 des données qui se trouvaient dans des tables hétérogènes niveau encodage.
    Je ne suis pas un pro des charset, etc. mais j'avais des tables en latin1 et certaines en utf8_general_ci, et selon les requêtes je devais changer le SET NAMES pour que mon import aboutisse.

    C'est dans ce sens là que j'ai posté cette réponse.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    C'est là où est ton erreur : le SET NAMES indique avec quel jeu de caractères on envoie les données à MySQL, quel que soit le jeu utilisé dans la colonne cible.

    Autrement dit, si j'envoie à MySQL des données UTF8 dans une table latin1, il fait automatiquement la conversion. Par contre, si je lui envoie des données UTF8 en faisant un SET NAMES latin1, je lui fais croire que mes données sont en latin1, donc il ne convertit plus et on se retrouve avec n'importe quoi...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    Merci pour l'explication !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Antoun
    le SET NAMES indique avec quel jeu de caractères on envoie les données à MySQL, quel que soit le jeu utilisé dans la colonne cible.
    Oui, Merci pour l'explication
    Mais dans l'autre sens : pour être sûr de récupérer de l'UTF-8
    comment fait-on ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    on indique que le client est en UTF8... ce qui s'exprime
    ;-)
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Merci pour ta réponse Antoun.

    J'aurais une petite dernière question…

    La création en UTF-8 de ma base n'a pas été une réussite (comme j'installe un ecommerce j'ai beaucoup de fichiers, d'includes, etc…*j'ai beaucoup trop de fichiers à modifier sans en oublier au passage).

    Je vais recommencer en iso-8859-1.
    Mais je n'ai pas cette option à la création. A moins que ça soit : latin1_general_ci
    C'est ça ?

    Et pis tiens tant que j'y suis :
    sans parler du contenu, mais juste au niveau de la structure est-ce qu'on peut modifier en latin1_general_ci une base créée en UTF-8 ou il vaut mieux tout recréer ?

    Merci pour ta patience !

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    - iso-8859-1 correspond effectivement à latin1

    - tant qu'il n'y a pas de données, tu peux modifier la structure comme tu veux

    - quand il y a des données... tant qu'elles sont correctes, on peut tout convertir dans tous les sens ; par contre dès qu'il y a des conneries, c'est assez difficile de s'en sortir parce que les conneries sont converties automatiquement aussi (la solution étant de passer par un BLOB).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Antoun
    (la solution étant de passer par un BLOB).
    Ah j'ai mis du temps à comprendre…

    Par exemple un type Tinyblob ou Longblob ?

    Ouh la la je rame à changer à la main les interclassements…
    Rien pout automatiser ça ?

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    SQL par exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -- modifie et convertit toutes les colonnes d'une table
    ALTER TABLE truc CONVERT TO utf8 COLLATE utf8_unicode_ci
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Citation Envoyé par Antoun
    on indique que le client est en UTF8... ce qui s'exprime
    Bon j'ai dû rater une marche
    si je mets : SET NAMES 'utf8'; la page ne se charge pas.
    Comment faut-il l'écrire ?

    J'ai juste besoin que les différentes query de la page soient passées en UTF-8 à la toute fin, juste avant un export en xml.

    En attendant j'ai mis : mysql_query("SET NAMES 'utf8'");
    et ça fonctionne. Mais tu me fais peur avec le fait qu'à cause de ça, je puisse écrire en UTF-8 dans la base latin1…

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 746
    Points : 316
    Points
    316
    Par défaut
    tu es en php c'est donc normal que tu passes le set names via le mysql_query, aucun problème dans ce que tu as fait.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    sauf que si j'enregistre quelque chose dans la base après cette ligne, cela sera en UTF-8 alors que la table est en Latin1, c'est ça ?

  17. #17
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Mister Paul
    sauf que si j'enregistre quelque chose dans la base après cette ligne, cela sera en UTF-8 alors que la table est en Latin1, c'est ça ?
    pas du tout. En gros, soit ton client (tes pages PHP) est déjà en UTF-8, et dans ce cas le SET NAMES corrigera une éventuelle erreur de déclaration, ou plus probablement ne changera rien.

    Pour ce qui est des données qui sortent de la base, le problème est un peu différent... mais on va commencer par faire un peu de diagnostic. Peux-tu passer les requêtes suivantes via ton mysql_query ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    -- config théorique :
    SHOW VARIABLES LIKE '%char%';
     
    -- détection de la config réelle :
    SELECT _utf8'é', _latin1'é', ORD(_utf8'é'), ORD(_latin1'é') ;
    PS : au passage, on écrit SET NAMES utf8 sans les apostrophes.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 747
    Points : 168
    Points
    168
    Par défaut
    Aïe je vais partir une semaine et je n'ai pas le temps là…
    Mais ça m'intéresse bien et j'essaierai ces tests à mon retour.

    En attendant j'ai fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $name = utf8_encode ($results[$i]['image']);
    Et ça marche impec…

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    en gros, si mes tests te montrent que ton client est en latin1 et déclaré en latin1, la meilleure solution est sans doute celle que tu as adoptée !

    Si tu cherches de la lecture pour tes vacances, je ne peux que te conseiller mon article "Jeux de caractères et collations" (lien en signature)

    PS : au passage, quand tu écris du code, pense à le mettre entre des balises [CODE][/CODE]
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Wamp] mysql_query("SET NAMES 'utf8'") valable sur Wamp ne fonctionne pas sur Xamp ?
    Par madina dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/08/2011, 02h16
  2. Equivalent SET NAMES 'utf8' ds MsSql
    Par khadir dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/04/2009, 12h01
  3. [MySQL] Appliquer SET NAMES 'utf8' de manière automatique
    Par Evocatii dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/03/2009, 18h14
  4. [MySQL] Éviter SET NAMES 'utf8' ?
    Par Evocatii dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/01/2009, 21h51
  5. [MySQL] problème mysql_query('SET NAMES 'UTF8'')
    Par saidkh dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2007, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo