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

 Firebird Discussion :

Char(x) -> chaine concaténée d'espaces ?


Sujet :

Firebird

  1. #1
    rgz
    rgz est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut [RESOLU]Char(x) -> chaine concaténée d'espaces ?
    Bonjour à tous,
    Je développe une application client serveur avec une base sous fire Bird (Alterna. D’Interbase). Je possède plusieurs tables (évidemment ) composées de champs de type char et de dimensions différentes. Jusque là, rien de spécial…

    L’application est développée sous Delphi via les composant interbase.
    A plusieurs moments, j’insert et je récupère des données de la base via des Tedit ou de Tmemo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE DOMAIN memo AS BLOB SUB_TYPE 1 SEGMENT SIZE 1000;
     
    create table societe (
       Soc_Id int NOT NULL,
       Soc_nom char(30) NOT NULL,
       Soc_Fax char(12),
       Soc_email char(30),
       Soc_Pageweb char(50),
       Soc_Commentaire memo,
       Soc_User_id Int,
       Soc_type CHAR(20),
       Soc_mode_id Int,
          PRIMARY KEY (Soc_Id)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    edt_fax.Text :=IBQuery_cli.FieldByName('soc_fax').AsString;
    edt_mail.Text :=IBQuery_cli.FieldByName('soc_email').AsString;
    edt_web.Text :=IBQuery_cli.FieldByName('soc_pageweb').AsString;
    Memo_comment.Text :=IBQuery_cli.FieldByName('soc_commentaire').AsString;
    Le champ memo de ma base à une dimension non prédéfinit puisque c’est un type que j’ai créée précédemment. Lorsque je lis une information dans un champ de ma base et que je l’affiche dans un Tedit (par exemple), il se passe un truc bizarre.

    Si le champ est du type memo, pas de problème, la chaîne renvoyée est nickel. Mais si elle d’un type char(X), la chaîne renvoyée est bonne mais elle concaténée d’espace jusqu’à la taille maximum (X)

    Exemple : si j’ai un champ
    Cli_nom char(50),

    Et que je lui affecte la chaine ‘developpez.com’
    La valeur renvoyée par :
    IBQuery.FieldByName(‘Cli_Nom’).AsString
    Sera ‘developpez.com________________________________________‘ et non ‘developpez.com’, je trouve ça dommage de devoir traiter les chaîne à chaque lecture !

    Existe t’il un moyen de remédier à ce problème ou ce problème est un fait ?

    Merci d'avance...[/u][/b][/code]

  2. #2
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Ton erreur est plutôt normal. En fait ce n'est pas une erreur. Tu peux utiliser deux types pour les chaînes de caractères (CHAR ou VARCHAR).

    CHAR: renvoit toujours le nombre maximum de caractères. Si la longueur est de 10, alors tu récupères 10 caractères.

    VARCHAR: renvoit toujours le nombre de caractères requit. Si la longueur est 10, et que tu as besoin que de 3 caractères, tu récupères 3 caractères.

    Soi tu utilises la fonction trunc avec char ou tu changes ton type char pour varchar.

    Bonne journée !

  3. #3
    rgz
    rgz est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    hummm "dakor"


    Merci à toi Dihap ...

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Mais de rien

  5. #5
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    pour pousser un poil plus loin les explications :

    char ou varchar ?
    niveau taille mémoire : ~equivalent

    si tu comptes faire des recherches sur ce champ, ou ordonner dessus : utilise char

    si tu comptes avoir un champ de taille variable, sur lequel tu ne fait pas de recherche ni de order by, varchar est ton type de variable

    enfin , pour liquider les espaces surnuméraires, quelques UDF sont fournies avec firebird et peuvent etre intégrées à tes bases ... parmi celles ci, il y a rtrim, qui supprime tous les espaces situés à droite d'une chaine de caractères...

  6. #6
    rgz
    rgz est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    ça c'est interressent Gillou merci, je vais regarder.

    Dit moi, un order by sur des champs de type varchar(X), c'est vraiment un risque au point de vue de la rapiditée ? ou ça va ?

    Et comment on utilise le rTrim ? Merci d'avance

  7. #7
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    pour le order by désolé, je sais pas du tout j'ai pas fait de test moi meme ... si tu veux vraiment le savoir tu peux tester toi même

    normalement dans le répertoire IB / FB , tu dois trouver
    rep UDF , avec IB_udf.dll
    rep exemples, avec ib_udf.sql
    qui te permettent de rajouter plusieurs fonctions a utiliser dans tes requetes SQL.
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DECLARE EXTERNAL FUNCTION RTRIM 
        CSTRING (80)
        RETURNS CSTRING (80)
        ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';
    une fois rajoutées , ce sont des fonctions qui s'utilisent normalement : select rtrim(table1.col1) from table1

  8. #8
    rgz
    rgz est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci gillou (j'ai l'impression de faire que ça )

    Je viens de tester sur 2 bases différentes, avec varchar(x) et char(x).
    J'ai fait des vieilles requetes bien lourdes sur les 2 BDD que j'avais surchargée précédemment, et je ne vois pas vraiment de différences de temps de réponses...

    Donc, je vais rester sur les VarChar(x) qui me semble suffisant pour mon appli'.


    Merci encore

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

Discussions similaires

  1. passer d'une chaine contenant des espaces a un tableau
    Par flyfrog dans le forum Contribuez
    Réponses: 3
    Dernier message: 26/06/2006, 21h12
  2. Réponses: 19
    Dernier message: 30/05/2006, 19h43
  3. convertir un char en int / et prob d'espace
    Par yanchasp dans le forum C++
    Réponses: 20
    Dernier message: 07/02/2006, 20h17
  4. Changer un char dans une chaine
    Par Calaz dans le forum C
    Réponses: 10
    Dernier message: 07/10/2005, 14h32
  5. [VB.NET] Compléter une chaine avec des espaces
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 10h09

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