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

Caml Discussion :

Mysql et les accents


Sujet :

Caml

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut Mysql et les accents
    Salut à tous.

    Lorsque j'insère dans ma base de données Mysql des données contenant des accents, je me retrouve dans la base avec des éééé en lieu et place de éééééé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    let query = "insert into ma_base (mon_champ) values 'éééé'";;
    let _ = exec cid query in ()
    Et j'ai beau testé en mettant des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let _ = exec cid (Mysql.escape query) in ()
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    let _ = exec cid (Mysql.ml2str query) in ()
    rien à faire.

    Les deux derniers cas la chaîne n'a plus une syntaxe Mysql correcte.

    Et pourtant, si je print query, la syntaxe est correcte et si je la copie colle dans phpmyadmin, l'insertion se fait de manière normale.

    Avez-vous déjà eu ce problème ? Une idée, une piste ?

    http://raevnos.pennmush.org/code/oca...doc/Mysql.html

    Merci,
    Dest.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Pour vous permettre de me donner un petit coup de main, voici un petit code qui compile et vous permet de tester l'insertion.

    Pour compiler: ocamlc.opt -o rw -I /usr/lib/ocaml/3.10.0/mysql/ mysql.cma sql.ml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    open Mysql
    open Unix
     
    type sql={
      s_login : string;
      s_pswd : string;
      s_host : string;
      s_port : string;
      s_dbname: string;
    }
     
    let retourne_cid c_sql =
     
      (* connexion id *)
      let cid =
     
        let db_info = ref {
          dbhost = None;
          dbname = None;
          dbport = None;
          dbpwd  = None;
          dbuser = None
        }
        in
     
          (* Host *)
          (
    	if String.length c_sql.s_host > 0 then
    	  db_info := {!db_info with dbhost = Some(c_sql.s_host)}
          );
     
     
          (* Database name *)
          (
    	if String.length c_sql.s_dbname > 0 then
    	  db_info := {!db_info with dbname = Some(c_sql.s_dbname)}
          );
     
     
          (* Port *)
          (
    	if String.length c_sql.s_port > 0 then
    	  db_info := {!db_info with dbport = Some(int_of_string c_sql.s_port)}
          );
     
     
          (* Database password *)
          (
    	if String.length c_sql.s_pswd > 0 then
    	  db_info := {!db_info with dbpwd = Some(c_sql.s_pswd)}
          );
     
     
          (* Database login *)
          (
    	if String.length c_sql.s_login > 0 then
    	  db_info := {!db_info with dbuser = Some(c_sql.s_login)}
          );
     
     
          Mysql.connect !db_info
      in
     
         cid
     
     
     
    let _ =
     
     let sql =  {s_login = "root";
      s_pswd = "mon_mdp";
      s_host = "localhost";
      s_port = "";
      s_dbname = "ma_base"}
    in
     
    let cid = retourne_cid sql in
     
      let query = "insert into rw_test (chaine) values ('cééé')" in
      let _ = exec cid query in ();
        Mysql.disconnect cid

    Merci du coup de pouce les gars.

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par dest Voir le message
    Avez-vous déjà eu ce problème ? Une idée, une piste ?
    Le problème est évidemment lié à unicode, UTF-8 plus précisément. Apparemment, ton programme OCaml essaie d'insérer une chaîne en utf-8 dans ta base MySQL mais celle-ci croit qu'elle reçoit des données 8-bits. C'est un problème lié à la configuration de ta BDD ou de ton éditeur selon ce que tu désires utiliser comme charset. Une dernière possibilité serait que le problème n'est ni au niveau de ton programme ni au niveau de la base, mais simplement au niveau du client affichant la chaîne contenue par la base, si celui ci ne comprend pas utf-8 ou croit que les données sont sur un encodage 8-bits.

    --
    Jedaï

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Oui, je me doute que c'est une histoire d'encodage.

    C'est pourquoi j'ai joué avec les différents "collation" que l'on peut mettre dans Mysql et j'ai donc affecté des champs en latin1, utf8,... et rien ne fonctionne.

    Le string source est en fait lu d'un fichier généré par le système d'exploitation à la suite d'une commande système.
    Je parse le fichier avec du input_line et tout ceci fonctionne très bien jusqu'à l'insertion dans la base SQL.

    Je pourrais evidemment remplacer tous les "é" par des "e" mais ce n'est pas mon but.

    Je viens de tester en enregistrant mon fichier source de test (celui donné plus haut) en 8859-15 et effectivement, les accents passent correctement.

    Je n'ai pas trouvé dans la doc caml comment convertir une chaîne de caractères dans un autre encodage. Mais c'est dommage que mysql ne me gère pas directement l'utf8.
    Je peux toujours rusé à coup de commande système et faire appel à "iconv" mais si vous avez une solution plus sympa, je veux bien.

    Merci.

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    J'ai l'impression que ton problème est plutôt du côté du client... A priori "éééé" est correct, je veux dire que éééé est bien l'affichage de la chaîne utf-8 correspondant à éééé. Etant donné que la tendance est plutôt le passage à l'unicode partout, il serait plus logique de corriger le client plutôt que de modifier le programme OCaml.
    Sinon tu peux utiliser Camomile pour faire les réencodage.

    --
    Jedaï

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Je n'ai pas essayé de faire un SELECT en CAML, c'est possible en effet que les éééé soient affichés de manière correcte.

    Cependant, les données sont stockées en BD et peuvent être récupérés par n'importe quel client. Je pense notamment à du php.

    Donc ca me gêne vraiment cet affichage bizarre dans la base, je préfèrerais que ce soit un affichage propre.

    Je viens de jeter un oeil rapide à camomile et effectivement, ca doit surement faire l'affaire.

    C'est tout de même dommage comme tu dis, de ne pas conserver l'unicode.

    Bref, je cherche toujours ce moyen de conserver l'utf8 et que ce soit affiché de manière correcte en BD. Je ne pense pas que ce soit dur mais probablement tordu.


    Edit: Haha, l'autre blague qui est possible aussi, c'est que lorsque l'on se loggue à phpmyadmin, il y a une case que je regarde jamais, c'est de choisir l'encodage au moment du login. J'essaierai ce soir en la passant en utf8 parce que je pense que de base, ca doit être du 8859-1

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut
    Alors alors... je viens de tester deux trois petits trucs.

    - J'ai inséré dans la base de données du texte en dur dans le code source enregistré en utf-8.

    - Je me suis loggué dans phpmyadmin en 8859-1, utf-8 puis j'ai tenté en modifiant à la main l'encodage dans firefox. Résultat : c'est illisible.

    - J'ai ensuite modifié le code source pour y faire un SELECT. Résultat: le texte est tout à fait normal

    - J'ai écrit un petit bout de PHP. Résultat: en mettant la page en utf-8, le texte s'affiche comme il faut.

    En conclusion, il semblerait que ce soit phpmyadmin qui merde pour afficher l'utf-8. J'avais tenté en mettant des é mais ça ne changeait rien.

    Donc bon, je vais me traîner avec un affichage moche dans phpmyadmin, tant pis.

Discussions similaires

  1. Mysql et les accents !
    Par le_misterioso dans le forum Administration
    Réponses: 6
    Dernier message: 23/04/2011, 06h11
  2. comment remplacer les accents mysql
    Par silvain dans le forum Outils
    Réponses: 13
    Dernier message: 22/02/2007, 12h09
  3. [mysql] interprète les accents
    Par nixax dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/12/2006, 19h33
  4. Retirer les accents d'une chaine avec MySQL
    Par orus8 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/02/2006, 16h47
  5. Comment afficher les accent sous mysql v4.0.13
    Par buildozer dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 09h33

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