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

Bases de données Delphi Discussion :

Firebird, utf-8, IBX taille des chaines de caractères


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Firebird, utf-8, IBX taille des chaines de caractères
    Bonjour,

    Outils utilisés: Delphi 10.3, Firebird 2.5, composants InterBase Express (IBX) (TIBDataBase, TIBTransaction, TIBDataset).

    Je ne suis pas un expert en SGBD, ni en delphi. Ayant effectué quelques recherches sur le sujet, je n'ai malheureusement pas pu trouver une explication/solution à un problème que je rencontre lors de la définition des champs de type chaîne de caractères dans un IBDataset.

    L'on m'a demandé de maintenir un programme codé avec Delphi. Le programme doit se connecter à une base de données Firebird.
    Avec un simple TIBDataset, je veux récupérer les champs de type varchar(84) (charset utf-8). Lorsque j'utilise la fonction "Ajouter tous les champs" (depuis l'éditeur de champs), les champs se créent de type TIBStringField.

    Le problème est que la taille est 4x plus grande que le nombre de caractère défini dans la base de données (84->336). J'ai alors un message de type "Dynamic SQL Error (-303)" qui apparaît ("arithmetic exception, numeric overflow, or string truncation. String right truncation").

    Je crois comprendre que le fait que un caractère utf-8 peut utiliser jusqu’à 4 bytes. Du coup, pour 84 caractère encodé en utf8, il réserve 336 bytes.

    Est-il normal que le composant IBDataset confondent la "taille" du champ varchar et le nombre de caractères que celui-ci peut contenir ? Est-ce une mauvaise configuration des composants IBX ou un manque de paramètre pour la connexion à la base de données ? Ou bien la base de données qui est mal configurée ?

    Merci d'avoir prit le temps de lire. Veuillez pardonner mon manque de compréhension à ce sujet.

  2. #2
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut
    bonjour,

    normalement il doit y a voir un composant de connexion que tu utilises et sur le quel tu branches tes ibquery.

    Ce composant comporte un champ charset avec un combobox dans lequel il faut sélectionner le charset approprié.


    Si tu ne l'as pas fait choisi l'utf8 ou a defaut unicode_fss

    Nom : ibx.PNG
Affichages : 290
Taille : 21,5 Ko

    cordialement

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci de votre réponse rapide !

    Effectivement, mon composant TIBDataSet utilise un composant de type TIBTransaction qui, lui, est connecté a un composant de type TIBDataBase.

    Voici comment le composant est configuré :

    Nom : TIBDatabase_config.png
Affichages : 280
Taille : 22,9 Ko

    Voici le problème en image :

    Nom : ajout_champ.png
Affichages : 276
Taille : 44,8 KoNom : definition_champ_code_cli.png
Affichages : 272
Taille : 41,0 Ko

    Vaut-il mieux utiliser le unicode_fss ? J'ai cru comprendre d'après le documentation Firebird, qu'il vallait mieux utiliser utf8 que unicode_fss.

    https://firebirdsql.org/file/documen...chartypes.html

    Merci pour votre temps et aide.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ce qui me fait tiquer c'est l'utilisation des composants TIBxxxxxx plutôt que FireDac ces premiers étant spécifiques à Interbase. Même si Firebird est une fourche d'Interbase les différences sont de plus en plus importantes. Personnellement j'ai cessé d'utiliser les TIBxxxxxx a tel point que je n'ai pas installé ce set de composants dans ma version 10.3 et donc ne peut faire un test.

    Une première chose à vérifier serait que la GDS32.DLL utilisée par l'IDE (donc censée se trouver dans windows\system32 et/ou windows\syswo64) corresponde bien à Firebird et ne serait pas une version d'Interbase (piège assez fréquent)

    Vaut-il mieux utiliser le unicode_fss ? J'ai cru comprendre d'après le documentation Firebird, qu'il vallait mieux utiliser utf8 que unicode_fss.
    tout dépend de votre besoin s'il s'agit uniquement de données "occidentales" l'encodage ISO8859_1 (l'ISO8859_1 de Firebird correspond en fait à la norme ISO8859_15 incluant le signe Euro ) ou WIN1252 sont aussi valables


    [Edit] après test (installation des TIBxxxxxx, copie de FBClient.dll en gds32.dll) j'en arrive effectivement au même constat un VARCHAR(20) devient une chaine de longueur 80 (ce qui n'est pas le cas avec FireDac) ,
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Merci pour ces précisons et d'avoir effectué des tests !
    J'en conclue que ce doit être un comportement par défaut.

    Effectivement, j'avais pensé migré depuis "Interbase Express(IBX)" vers "FireDAC".
    Mais comme le programme, que je dois maintenir, se connecte uniquement sur une base de données Firebird, je ne pensais pas que l'investissement en valait la peine.

    Pensez-vous qu'IBX n'est pas/plus conseillé pour FireBird ? Ou qu'il soit dépassé ?
    Est-il compliqué de migrer une application d'IBX vers FireDAC (L'application contient une quarantaine de module de données (sans compter les popup)) ?
    Y'a-t-il des outils ou des "faciliteurs" pour effectuer cette opération ?

    A nouveau, merci pour votre temps et aide.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ChronikBNC Voir le message
    J'en conclue que ce doit être un comportement par défaut.
    non, je ne crois pas mais il faudrait essayer sur une base Interbase pour vérifier

    Effectivement, j'avais pensé migré depuis "Interbase Express(IBX)" vers "FireDAC".
    Mais comme le programme, que je dois maintenir, se connecte uniquement sur une base de données Firebird, je ne pensais pas que l'investissement en valait la peine.
    ce serait nettement mieux, c'est plutôt IBX pour Firebird qui est mal à propos

    Pensez-vous qu'IBX n'est pas/plus conseillé pour FireBird ? Ou qu'il soit dépassé ?
    dépassé je ne sais pas mais il est adapté à Interbase et l'écart se creusant entre Firebird et Interbase je ne le conseille pas

    Est-il compliqué de migrer une application d'IBX vers FireDAC (L'application contient une quarantaine de module de données (sans compter les popup)) ?
    je n'ai jamais essayé mais je ne pense pas
    Y'a-t-il des outils ou des "faciliteurs" pour effectuer cette opération ?
    Oui, ce qui s'applique pour migrer de BDE vers Firedac doit pouvoir se faire de IBX vers Firedac l'outil pour BDE->Firedac
    voir ce qui se trouve dans le dossier Embarcadero\Studio\20.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind

    à lire/voir (portugues) https://fernandorizzato.com/2017/02/...ormas-parte-4/

    Cela dit, il faudra un peu d'huile de coude et utiliser ensuite toutes les possibilités de Firedac
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Merci pour toutes ces précisions.

    J'ai commencé à me documenter sur FireDac et je vais étudier les différents procédés pour migrer l'application depuis IBX vers FireDac.

    L'application a commencé à être développée dans les années 2000+, et effectivement le SGBD utilisé était Interbase.

    Bonne journée !

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

Discussions similaires

  1. Problème dans des "IF" avec des chaines de caractères
    Par lanysteph dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 11h37
  2. Réponses: 12
    Dernier message: 09/09/2006, 11h54
  3. [VB.NET]comment on filtre des chaines de caractères ?
    Par zouhib dans le forum Windows Forms
    Réponses: 61
    Dernier message: 14/06/2006, 14h33
  4. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25
  5. Repérer des chaines de caractères formatée dans du texte
    Par jeremiegrenoble dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/02/2006, 13h06

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