Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/12/2010, 16h39   #1
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
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.
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 22h14   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 965
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 965
Points : 18 191
Points : 18 191
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 22h59   #3
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
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.
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2010, 23h56   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
bonjour,

c'est impossible. A un champ correspond un unique type de données
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 00h58   #5
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
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 :
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.
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 07h55   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 965
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 965
Points : 18 191
Points : 18 191
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 09h20   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
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.
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 14h52   #8
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
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.
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 15h30   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 965
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 965
Points : 18 191
Points : 18 191
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 17h58   #10
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
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 :
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']";
}
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 10h38   #11
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
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)
Maljuna Kris est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 11h09   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 965
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 965
Points : 18 191
Points : 18 191
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 19h44   #13
Nouveau Membre du Club
 
Inscription : mars 2008
Messages : 84
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2008
Messages : 84
Points : 30
Points : 30
Oui je comprend vos avis, merci en tout cas.
Drone est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h39.


 
 
 
 
Partenaires

Hébergement Web