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

 MySQL Discussion :

Valeur en octet suivant la valeur du champ.


Sujet :

MySQL

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut Valeur en octet suivant la valeur du champ.
    Bonjour,
    J'ai un champ qui doit contenir des entiers inférieur à 990.
    Je ne peux donc lui mettre un type TINYINT qui j'ai cru comprendre ne dépasse pas les entiers de + de 255.

    Ce qui me gêne c'est que sur 40000 données de ce champs, seulement 200 contiennent un entier supérieur à 100, tout le reste se trouve entre 970 et 990

    J'utilise le type SMALLINT qui me coûte 2octets et j'aimerais savoir si il y a moyen que mes champs qui contiennent un entier de 100 n'utilisent automatiquement dans SQL qu'un seul octet ?

    Une question hors sujet : l'option taille valeurs pour un entier sert juste à limiter le champ mais le nombre d'octet lui ne change pas ? même si par exemple un SMALLINT est limité a 2 chiffres ?

    Merci.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Ton ordinateur a t-il 30 ans pour que tu sois à la chasse aux octets à ce point ?

    Puisque les valeurs peuvent aller jusqu'à 990, va pour le SMALLINT ! Ça te fait 40 000 octets de plus, soit 39 ko. C'est pas la mer à boire quand même !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut
    Je pensais bien que pour le cas que je soumet vous me trouveriez pointilleux et j'en suis désolé.
    Ce qui m'intéresse c'est de savoir diminuer mes octets dynamiquement suivant la valeur du champ, que si par exemple mon champ à une valeur plus basse que 256 alors le type de mon champs soit égal à 1octet soit tinyInt, et faire cette opération automatiquement dans mon serveur de base de donnée.

    Merci pour votre réponse.

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    bonjour,

    c'est impossible. A un champ correspond un unique type de données

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut
    Bonsoir, merci pour la réponse.

    Est il possible d'avoir un champ qui contient deux autres champs ? l'un avec un type smallint et l'autre avec un tinyint ?

    Et j'ai une idée surement fausse.. un champ de type smallint, même s'il ne contient rien il aura dans chaque nouvel enregistrement un poid de 2 octet ?

    Parce que sinon je pensais faire un déclencheur du genre :


    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
    CREATE TRIGGER AjoutCP AFTER INSERT ON ville
    FOR EACH ROW
    BEGIN
     
    IF (NEW.CP < 256 ) THEN
    BEGIN
     
    DECLARE @ID int
    DECLARE @CP tinyint
    SET @ID = NEW.ID
    SET @CP = NEW.CP
     
    UPDATE ville
    SET CP = '', CP_tinylInt = @CP
    WHERE id = @ID
     
    ENDIF
     
    END
    Pour l'explication, ma table contiendrait deux champ CP, un champ CP de type smallint et un champ CP_tinyInt de type tinyint.
    Si lors d'un nouvel enregistrement la valeur du champ est inférieur à 256, alors je la déplace dans le champ CP_tinyInt.

    Maintenant je pense que c'est nul car un champ vide à toujours le poid de son type n'est ce pas ?

    Merci.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Je pense effectivement qu'une colonne (et pas champ !) occupera l'espace pour lequel elle est prévue, qu'il y ait une valeur ou non, mais ton truc pour le coup reviendrait à alourdir la BDD puisqu'il y aurait deux colonnes au lieu d'une. Sans compter l'exécution du trigger qui est plus longue qu'un simple insert.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Même si je comprends que vous vouliez bien faire, je suis de l'avis de CinePhil. Cet octet de plus par ligne ne devrait pas vous poser de problème de performance ou d'espace de volumétrie.

    Je pense qu'ailleurs dans votre modélisation, vous devriez avoir matière à optimisation pour des gains plus significatifs.

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut
    Bonjour,
    je suis d'accord avec vous, ce n'était qu'un jeu pour moi d'essayer de récupérer un octet. De même qu'un trigger c'est lourd, mais je voulais tester.

    Je me suis résolu à plus simple, même si au final j'ai du utiliser des varchar...

    Faire un requête php qui suivant la taille de la donnée, insère la donnée dans une table fille qui contiendrait un champ smallint.

    Et lors d'un select appeler la mère et la fille.. enfin c'est vraiment bidouiller pour pas grand chose j'en suis conscient.

    Merci tout de même de l'intérêt que vous avez porté à ce post.

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Drone Voir le message
    Je me suis résolu à plus simple, même si au final j'ai du utiliser des varchar...
    Euh... pour le coup, adieu les économies !

    Un VARCHAR(3) occupe jusqu'à 4 octets ! 1 par caractère + 1 pour la taille de la chaîne.

    Et il faudrait savoir si votre colonne stocke une donnée de type numérique (identifiant, quantité...) ou alphanumérique (code, numéro, référence, matricule...). Si vous devez ensuite transformer la chaîne de caractères en nombre pour faire des calculs dessus, c'est un coût supplémentaire à l'exécution qui se multiplie par le nombre de lignes traitées !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut
    Et bien ce sont des caractères alphanumérique, sur 40000 données, il doit y en avoir une 20aine qui contienne des lettres, comme pour le smallint c'est rare.
    Cependant non je n'ai pas de calcul à faire dessus, juste des insertions et surtout des affichages de la totalité des données, trié etc.. donc plus la donnée est faible mieux je pensais m'en tirer.

    Merci pour la précision pour varchar, je suis au courant du L + 1 octet par caractère.

    Je pense faire des tables filles.
    Car la vérification du type de donnée se fait seulement à l'insertion pour savoir si j'insère sur une table ou un autre.
    Ensuite pour l'affichage, je fais une vue sur les deux tables, il n'y a pas de calcul.

    Ca me ferait une insert sur la table mère de tout les autres valeurs, puis une requête du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (is_string($tab['var']))
    $query = "INSERT INTO fille_varchar VALUES ($tab['var'],$tab['id']";
     
    else 
    {
       if $tab['var']>255
       $query = "INSERT INTO fille_smallint VALUES ($tab['var'],$tab['id']";
       else
       $query = "INSERT INTO fille_tinyint VALUES ($tab['var'],$tab['id']";
    }

  11. #11
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    S'il s'agit, fonctionnellement, du même attribut d'une entité du MCD, les requêtes à venir pour tout calcul de groupage nécessiteront de faire une UNION entre les deux tables filles ce qui m'apparaît le contraire du principe KISS, pour un gain assez illusoire.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Et, encore une fois, 40 000 lignes, ce n'est rien pour un SGBD !
    Alors une seule colonne de type VARCHAR de la taille juste nécessaire, un index dessus et roule ma poule !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Par défaut
    Oui je comprend vos avis, merci en tout cas.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2014, 20h02
  2. Réponses: 4
    Dernier message: 27/03/2008, 23h01
  3. Réponses: 4
    Dernier message: 25/04/2007, 16h23
  4. Réponses: 3
    Dernier message: 23/04/2007, 11h55
  5. Réponses: 11
    Dernier message: 30/03/2007, 10h30

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