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 :

récupérer le type d'un champ


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut récupérer le type d'un champ
    Bonjour.
    J'ai pas mal fouillé les faq, les tutoriels et les forums, mais je n'ai pas trouvé de réponse complète à ce que je recherche (les éléments trouvés m'ont cependant permis d'élaborer la solution sustitutive que j'expose ci-dessous)

    Précision : je travaille avec delphi 2005 et mysql.pas

    En fait je souhaite récupérer les données de mes tables pour faire une sauvegarde à l'aide d'une procédure générique.
    Pour cela, je cherche à récupérer le type des champs pour savoir si j'inclus dans le code un quotedstr ou non
    En fouillant un peu dans le code de mysql.pas, j'ai vu que le type mysql_field proposait une valeur ._type censée donner le type de champs selon un ensemble enum_field_types
    Lorsque j'ai essayé cette méthode, les valeurs retournées m'ont semblé inexploitables, car la valeur retournée est assez farfelue (par exemple, quelle que soit la table, le dernier champ retourne toujours 51 quel que soit le type de champ)
    J'ai également tenté d'utiliser les fonctions is_num, is_num_field, sans succès :o(
    J'ai donc utilisé le code suivant, qui me paraît un peu "barbare", en créant une fonction numtype renvoyant un boolean après comparaison avec un ensemble de valeur représentant un type numérique.
    Je suppose qu'il existe un autre moyen que d'extraire les informations de la colonne dans une requête pour comparer la valeur du champ type avec le référentiel au sein de la fonction numtype ?
    Quelqu'un aurait-il une solution plus élégante ?
    Je sais également qu'il existe mysqldump, mais la résolution de cette fonctionnalité constitue pour moi un très bon exercice pour (tenter de) m'améliorer (par ailleurs, le nombre d'option possible m'a un peu fait peur : ça a l'air assez complexe)
    Ensuite je vous interrogerai peut-être pour savoir comment faire pour exécuter un fichier contenant toutes les requêtes créées par ma fonction de sauvegarde afin de faire un restore (hormis parser le fichier jusqu'au prochain point virgule, je n'ai pas trouvé de solution toute faite pour exécuter une suite de requête rassemblée au sein d'un même fichier (mais je débute !))
    Merci d'avance pour votre aide si précieuse ;o)

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    Var
      myres, myres2: PMYSQL_RES;
      myROW, myrow2 : PMYSQL_ROW;
      field: pmysql_field;
      aStr : AnsiString;
      s, sigle, letype: string;
      i,j, nbcol : integer;
     
      refchampnum: set of 0..255;
     
      function numtype(s: string): boolean;
      begin
      result:=false;
      s:=leftstr(s, pos('(',s)-1);
      if    (s='tinyint')
         or (s='bit')
         or (s='smallint')
         or (s='mediumint')
         or (s='int')
         or (s='integer')
         or (s='big')
         or (s='float')
         or (s='double')
         or (s='decimal')
         or (s='dec')
         or (s='numeric')
         or (s='fixed')
         or (s='year')
         then
         result:=true;
      end;
     
      procedure dumptable(t: string);
      var
         i, j: integer;
      begin
      with memor.Lines do
           begin
           refchampnum:=[];
           mysql_query(mysqlc, pChar('select * from '+t));
           myres:=mysql_store_result(MySQLc);
           if myres<>nil then
              begin
              s:='INSERT INTO '+t+' (';
              for i:=0 to mysql_num_fields(myres)-1 do
                  begin
                  field:=mysql_fetch_field_direct(myres, i);
                  s:=s+field.name;
                  if i<>lb2.Count-1 then
                     s:=s+', ';
                  mysql_query(mysqlc, pChar('SHOW COLUMNS FROM '+t+' LIKE '+quotedstr(field.name)));
                  myres2:=mysql_store_result(MySQLc);
                  if myres2<>nil then
                     begin
                     letype:=mysql_fetch_row(myres2)^[1];
                     if numtype(letype) then
                        refchampnum:=refchampnum + [i];
                     mysql_free_result(myRES2);
                     end;
                  end;
              s:=s+') VALUES ';
              add(s);
              for i:=0 to myRES.row_count-1 do
                 begin
                 myROW:=mysql_fetch_row(myRES);
                 if myrow<>nil then
                    begin
                    s:='(';
                    for j:=0 to mysql_num_fields(myRES)-1 do
                        begin
                        if j in refchampnum then
                           s:=s+myrow^[j]
                        else
                           s:=s+quotedstr(myrow^[j]);
                        if j<>mysql_num_fields(myRES)-1 then
                           s:=s+','
                        else
                           if i<>myRES.row_count-1 then
                              s:=s+'),'
                           else
                              s:=s+');';
                        end;
                    add(s);
                    end;
                 end;
              mysql_free_result(myRES);
              end;
           add('');
           end;
      end;

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Quelle version de MySQL utilises-tu ?
    Si c'est une version supérieure ou égale à la 5.0.2, tu peux utiliser une requête sur le catalogue MySQL (la base INFORMATION_SCHEMA). La table qui t'intéresse s'appelle INFORMATION_SCHEMA.COLUMNS, et le champ DATA_TYPE donne le type d'une colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COLUMN_NAME, DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'nom_table'
    Sinon, il faut utiliser la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SHOW COLUMNS FROM nom_table
    La colonne TYPE renvoie type de la colonne.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    merci pour ces renseignements
    c'est la 5.0.5b, la dernière en titre je crois
    je ne m'étais pas encore intéressé à ces informations qui apparaissent par défaut lorsqu'on consulte les bases et les tables avec un gui

    je n'ai pas encore compris où ces tables sont stockées car je n'ai vu qu'une base mysql ... c'est créé dynamiquement sans doute ?

    je vais me pencher sur ce nouvel aspect de mysql

    yvan

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    sinon, la méthode que j'ai employée te paraît "orthodoxe" ?
    y

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par yvan.chambault Voir le message
    je n'ai pas encore compris où ces tables sont stockées car je n'ai vu qu'une base mysql ... c'est créé dynamiquement sans doute ?
    Oui, c'est créé dynamiquement. Et tout utilisateur peut avoir accès aux informations du catalogue, du moment où il a les droits de lecture sur une base (il voit alors les informations du catalogue concernant cette base).

    Avec la commande SHOW, ça reste les deux moyens les plus "orthodoxes" d'obtenir des informations sur une base de données .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. récupérer le type des champs dans un fichier access
    Par patrickbaras dans le forum WinDev
    Réponses: 2
    Dernier message: 06/09/2010, 10h29
  2. [Interbase/Firebird] Comment récupérer le type du champ ?
    Par kabish dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/01/2008, 10h28
  3. Récupérer la valeur d'un champ de type énuméré
    Par warzas dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 07/11/2007, 10h00
  4. Réponses: 4
    Dernier message: 27/07/2007, 11h13
  5. Fonction qui permet de récupérer le type d'un champ
    Par suolan dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/06/2006, 16h47

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