Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1171 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Quel type de champ pour quel type de données ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Quel type de champ pour quel type de données ?

n°1320062
Dj YeLL
$question = $to_be || !$to_be;
Posté le 07-03-2006 à 11:55:01  profilanswer
 

Bonjour à tous,
 
Ça fait un bout de temps que j'utilise MySQL, et j'ai toujours autant de "mal" à choisir correctement le bon type de colonne.
 
Savez-vous s'il existe un site qui regrouperait les types recommandés pour chaque type de contenu ?
 
Car bien evidemment, c'est vague et c'est au choix de chacun, mais je pense que ce serait sympa une base de départ.
 
Par exemple, je suis en train de me poser la question pour stocker des tarifs (qui ne dépasseraient jamais 999€99), le type le plus approprié est-il un FLOAT(5,2) ?
 
Merci par avance :)
 
P.S. : Un autre exemple serait un code postal ... faut-il utiliser un CHAR(5), un VARCHAR(5) ou plutôt des types numérique ? (je voterais plutôt pour CHAR(5), j'ai bon ? :D)


---------------
Gamertag: CoteBlack YeLL
mood
Publicité
Posté le 07-03-2006 à 11:55:01  profilanswer
 

n°1321044
dlaumor
Posté le 08-03-2006 à 16:12:38  profilanswer
 

Pour les codes postaux pas du numérique parce que sinon tu vas perdre le 0 pour les départements <10
 
Moi aussi je prendrais du CHAR(5) car TOUS les codes postaux ont 5 caractères...
 
Le VARCHAR je l'utilise plus quand la taille du champ est variable genre un libellé.
 
Sinon j'ai pas de lien à te filer, désolé

n°1321288
Dj YeLL
$question = $to_be || !$to_be;
Posté le 08-03-2006 à 19:30:07  profilanswer
 

Merci quand même pour ta participation :)
 
:jap:


---------------
Gamertag: CoteBlack YeLL
n°1324029
Djebel1
Nul professionnel
Posté le 13-03-2006 à 11:11:56  profilanswer
 
n°1604731
fourniey
Rendre au prochain
Posté le 27-08-2007 à 20:35:22  profilanswer
 


 
Dommage que ce lien ne fonctionne plus.

n°1604736
flo850
moi je
Posté le 27-08-2007 à 20:41:22  profilanswer
 

pour un CP : char(5) si tu as des CP uniquement français , histoire de conserver le 0 devant  
 
pour des tarifs float > en effet, ca prends moins de pace et et u peux faire des requetes arithmétiques ( prix < 100e par exemple) ou des sommes

n°1604760
mrbebert
Posté le 27-08-2007 à 21:55:17  profilanswer
 

En fonction des besoins, on peut aussi envisager un type "INT" (il suffit de considérer que la valeur est exprimée en centimes :D )

n°1605223
MagicBuzz
Posté le 28-08-2007 à 14:24:42  profilanswer
 

dlaumor a écrit :

Pour les codes postaux pas du numérique parce que sinon tu vas perdre le 0 pour les départements <10
 
Moi aussi je prendrais du CHAR(5) car TOUS les codes postaux ont 5 caractères...
 
Le VARCHAR je l'utilise plus quand la taille du champ est variable genre un libellé.
 
Sinon j'ai pas de lien à te filer, désolé


 
Faux.
Certains CP font plus de 5 caractères. C'est d'autant vrai si demain le site se trouve à être multi-nationnal.
 
Re-faux.
Un varchar(5) fait AU PLUS 5 caractères. Tout comme le CHAR, toute tentative de dépassement résultera dans une troncature du champ.
 
CHAR n'est recommandé que dans le cas où tu as besoin de grandes performances sur une table, ou que tu es absolument sûr et certain de la taille du champ (par exemple, une clé de cryptage).
Dans le cas contraire, le problème c'est que "A" en CHAR(5) est représenté "A____" ce qui mesure donc 5 caractères. Tout traîtement sur les chaînes par la suite impliquera donc l'utilisation intensive,abusive et inutile de Trim() sur la chaîne afin d'enlever les espaces superflus.
 
 
Pour ce qui est de FLOAT(5,2) c'est une hérésie. Les chiffres passés en paramètre n'ont à priori aucun impact, autre que l'affichage dans certains éditeurs SQL.
Un FLOAT, c'est un FLOAT, point barre.
 
Pour des tarifs, travailler en float est une erreur, car les calculs en virgule flottante ne sont pas précis, et il peut en résulter des écarts. De même, les calculs en virgule flottante ne sont pas fixes en nombre de décimales, ce qui peut impliquer des arrondis erronnés : (10,01 € / 10) * 10 = 10 € dans la vraie vie, pas 10,01 comme te donneras un float.
 
Tu dois donc travailler avec le type NUMERIC/DECIMAL, qui proposent une représentation à virgule fixe : NUMERIC(5,2) = 000,00 et la précision est absolue et figée : parfait pour travailler avec des prix.

n°1605224
MagicBuzz
Posté le 28-08-2007 à 14:25:29  profilanswer
 

PS : c quoi ce vieux topic qui sent le moisi ? Et moi qui poste dedans comme un con :o

n°1605450
fourniey
Rendre au prochain
Posté le 28-08-2007 à 18:36:54  profilanswer
 

Je voulais juste un nouveaut site.

mood
Publicité
Posté le 28-08-2007 à 18:36:54  profilanswer
 

n°1605567
thierryR
J'aime les bretzels
Posté le 29-08-2007 à 09:16:40  profilanswer
 

Merci de l'info, j'ai appris quelque choses.


---------------
Penguin online qui ne fait que des conneries, et qui aime ça. Membre du http://www.fonacon.net/
n°1663429
Noisequik
Posté le 27-12-2007 à 16:42:52  profilanswer
 

+1 c'est du bon déterrage de topic çà

n°1663430
FlorentG
Unité de Masse
Posté le 27-12-2007 à 16:43:56  profilanswer
 

Justement...

n°1664086
moi23372
Posté le 30-12-2007 à 13:28:48  profilanswer
 

MagicBuzz a écrit :


 
Faux.
Certains CP font plus de 5 caractères. C'est d'autant vrai si demain le site se trouve à être multi-nationnal.
 
Re-faux.
Un varchar(5) fait AU PLUS 5 caractères. Tout comme le CHAR, toute tentative de dépassement résultera dans une troncature du champ.
 
CHAR n'est recommandé que dans le cas où tu as besoin de grandes performances sur une table, ou que tu es absolument sûr et certain de la taille du champ (par exemple, une clé de cryptage).
Dans le cas contraire, le problème c'est que "A" en CHAR(5) est représenté "A____" ce qui mesure donc 5 caractères. Tout traîtement sur les chaînes par la suite impliquera donc l'utilisation intensive,abusive et inutile de Trim() sur la chaîne afin d'enlever les espaces superflus.
 
 
Pour ce qui est de FLOAT(5,2) c'est une hérésie. Les chiffres passés en paramètre n'ont à priori aucun impact, autre que l'affichage dans certains éditeurs SQL.
Un FLOAT, c'est un FLOAT, point barre.
 
Pour des tarifs, travailler en float est une erreur, car les calculs en virgule flottante ne sont pas précis, et il peut en résulter des écarts. De même, les calculs en virgule flottante ne sont pas fixes en nombre de décimales, ce qui peut impliquer des arrondis erronnés : (10,01 € / 10) * 10 = 10 € dans la vraie vie, pas 10,01 comme te donneras un float.
 
Tu dois donc travailler avec le type NUMERIC/DECIMAL, qui proposent une représentation à virgule fixe : NUMERIC(5,2) = 000,00 et la précision est absolue et figée : parfait pour travailler avec des prix.


 
 
Un Float est un Float et les paramètres qu'on y passe ne serve qu'a l'affichage?
Tu as été trouvé cela ou? c'est du gros n'importe quoi.  
 
Essaye de mettre 7.123456789 dans un float(7.2), ton nombre sera tronqué ou arrondi en fonction des SGBD.  
Fais l'expérience et tu veras ce que ça donnera. Du moins avec ORACLE et SQL SERVER c'est comme cela, et la norme SQL2 l'exprime également de cette façon...

n°1664729
MagicBuzz
Posté le 02-01-2008 à 14:15:39  profilanswer
 

euh... je vérifie un truc, mais à la base...
 
pour moi, y'a pas de "float" dans la norme SQL92
 
son "équivalent" c'est "double"
 
et il ne prends pas de paramètres à la déclaration
 
je check :o

n°1664733
MagicBuzz
Posté le 02-01-2008 à 14:26:28  profilanswer
 

alors donc :
 
1/ C'est bien "float" le nom en SQL 92 (confusionné avec le "double precision" )
2/ Il ne supporte qu'un seul paramètre, qui n'as rien à voir avec le nombre de décimales, mais le nombre de bits utilisés pour stocker le nombre. En somme, que le paramètre doit grand ou petit, le RANGE des valeurs est le même, par contre la précision va varier.
 
Donc 7.123456789 dans un float(7) et non float(7.2) donnera peut-être 7.123456788 à la place de la valeur exacte, mais en aucun cas fera d'arrondi.
 

Citation :


SQL Server 2005 Books Online (September 2007)
float and real (Transact-SQL)
 
Approximate-number data types for use with floating point numeric data. Floating point data is approximate; therefore, not all values in the data type range can be represented exactly.  
 
Note:  
The SQL-92 synonym for real is float(24).
 
 
 
Data type  Range  Storage  
float  
 - 1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308
 Depends on the value of n
 
real  
 - 3.40E + 38 to -1.18E - 38, 0 and 1.18E - 38 to 3.40E + 38
 4 Bytes
 
 
 Transact-SQL Syntax Conventions
 
 Syntax  
float [ ( n ) ]  
Where n is the number of bits that are used to store the mantissa of the float number in scientific notation and, therefore, dictates the precision and storage size. If n is specified, it must be a value between 1 and 53. The default value of n is 53.
 
n value  Precision  Storage size  
1-24  
 7 digits
 4 bytes
 
25-53  
 15 digits
 8 bytes
 
 
Note:  
SQL Server 2005 treats n as one of two possible values. If 1<=n<=24, n is treated as 24. If 25<=n<=53, n is treated as 53.
 
 
 
The SQL Server float[(n)] data type complies with the SQL-92 standard for all values of n from 1 through 53. The synonym for double precision is float(53).


 
Test :

Code :
  1. declare @test1 AS float(4)
  2. declare @test2 AS float(53)
  3.  
  4. SET @test1 = 0.12345678901234567890
  5. SET @test2 = 0.12345678901234567890
  6.  
  7. SELECT @test1
  8. SELECT @test2



 
-------------
0.1234568
 
(1 ligne(s) affectée(s))
 
 
----------------------
0.123456789012346
 
(1 ligne(s) affectée(s))
 


 
tout ça pour dire que si dfans mysql il y a un second paramètre, soit il ne sert qu'à l'affichage, soit float est alors un synonyme de decimal et non de float, soit mysql (comme d'habitude) est une grosse bouse infâme qui n'a rien de compatible avec sql92

Message cité 1 fois
Message édité par MagicBuzz le 02-01-2008 à 14:39:41
n°1664760
omega2
Posté le 02-01-2008 à 15:08:33  profilanswer
 

RTFM : http://dev.mysql.com/doc/refman/5. [...] types.html

Citation :

Le type FLOAT est utilisé pour représenter des données numériques approchées. La norme ANSI/ISO SQL92 permet la spécification optionnelle de la précision (mais pas de l'intervalle de validité) en fournissant le nombre de décimales voulues après la spécification de type, et entre parenthèses. L'implémentation de MySQL supporte aussi le paramétrage de la précision. Si le mot clé FLOAT est utilisé pour une colonne sans précision supplémentaire, MySQL utilise quatre octets pour stocker les valeurs. Une syntaxe alternative existe aussi, elle utilise deux paramètre optionnel après le mot clé FLOAT. Avec cette option, le premier nombre représente toujours la taille de stockage nécessaire pour la valeur, et le second nombre représente le nombre de chiffres à stocker et afficher, après la virgule décimale (comme pour les types DECIMAL et NUMERIC). Lorsque MySQL stocke un nombre pour une telle colonne, et que cette valeur a plus de décimale que requis, la valeur est arrondie pour éliminer les chiffres surnuméraires.


 
En gros, si j'ai bien pigé, avec mysql, soit on définit la colonne comme indiqué dans la norme SQL92 (auquel cas, c'est conforme à la nombre SQL92) soit on définit la colonne en indiquant deux nombres auquel cas c'est comme un synonyme de DECIMAL mais stocké dans un float (ne me demande surtout pas pourquoi ils stockent les DECIMAL comme des chaines de caractères)

n°1664765
MagicBuzz
Posté le 02-01-2008 à 15:16:18  profilanswer
 

et donc, comme je disais au début, si on spécifie une précision au type float, c'est qu'on n'a pas besoin d'un float, mais d'un decimal
 
 [:cerveau galatee]

n°1664799
masklinn
í dag viðrar vel til loftárása
Posté le 02-01-2008 à 15:45:23  profilanswer
 

De toute façon quand on fait de la finance il faut toujours utiliser soit des entiers (e.g. en centimes) ou des décimaux, jamais des floats :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1666106
moi23372
Posté le 04-01-2008 à 20:39:06  profilanswer
 

MagicBuzz a écrit :

alors donc :
 
1/ C'est bien "float" le nom en SQL 92 (confusionné avec le "double precision" )
2/ Il ne supporte qu'un seul paramètre, qui n'as rien à voir avec le nombre de décimales, mais le nombre de bits utilisés pour stocker le nombre. En somme, que le paramètre doit grand ou petit, le RANGE des valeurs est le même, par contre la précision va varier.
 
Donc 7.123456789 dans un float(7) et non float(7.2) donnera peut-être 7.123456788 à la place de la valeur exacte, mais en aucun cas fera d'arrondi.
 

Citation :


SQL Server 2005 Books Online (September 2007)
float and real (Transact-SQL)
 
Approximate-number data types for use with floating point numeric data. Floating point data is approximate; therefore, not all values in the data type range can be represented exactly.  
 
Note:  
The SQL-92 synonym for real is float(24).
 
 
 
Data type  Range  Storage  
float  
 - 1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308
 Depends on the value of n
 
real  
 - 3.40E + 38 to -1.18E - 38, 0 and 1.18E - 38 to 3.40E + 38
 4 Bytes
 
 
 Transact-SQL Syntax Conventions
 
 Syntax  
float [ ( n ) ]  
Where n is the number of bits that are used to store the mantissa of the float number in scientific notation and, therefore, dictates the precision and storage size. If n is specified, it must be a value between 1 and 53. The default value of n is 53.
 
n value  Precision  Storage size  
1-24  
 7 digits
 4 bytes
 
25-53  
 15 digits
 8 bytes
 
 
Note:  
SQL Server 2005 treats n as one of two possible values. If 1<=n<=24, n is treated as 24. If 25<=n<=53, n is treated as 53.
 
 
 
The SQL Server float[(n)] data type complies with the SQL-92 standard for all values of n from 1 through 53. The synonym for double precision is float(53).


 
Test :

Code :
  1. declare @test1 AS float(4)
  2. declare @test2 AS float(53)
  3.  
  4. SET @test1 = 0.12345678901234567890
  5. SET @test2 = 0.12345678901234567890
  6.  
  7. SELECT @test1
  8. SELECT @test2



 
-------------
0.1234568
 
(1 ligne(s) affectée(s))
 
 
----------------------
0.123456789012346
 
(1 ligne(s) affectée(s))
 


 
tout ça pour dire que si dfans mysql il y a un second paramètre, soit il ne sert qu'à l'affichage, soit float est alors un synonyme de decimal et non de float, soit mysql (comme d'habitude) est une grosse bouse infâme qui n'a rien de compatible avec sql92


 
je dois me tromper avec les NUMBER d'oracle alors. Car les number oracle, numeric en SQL SERVER, se comporte comme je te l'ai expliqué.  
 
NUMBER(4,2) => 2 décimales
NUMERIC(4,2) => 2 décimales

n°1666976
MagicBuzz
Posté le 07-01-2008 à 09:42:54  profilanswer
 

Oui, c'est NUMBER, qui est effectivement un synonyme de NUMERIC, qui est un synonyme de DECIMAL ;)
 
FLOAT, c'est un type complètement à part, dont le comportement est totalement différent ;)
Le paramètre est similaire à celui de INTEGER, à la différence près qu'en FLOAT, la taille en mémoire n'influence pas le range de valeurs, mais uniquement la précision :)

n°1916504
popov130
Posté le 19-08-2009 à 11:14:19  profilanswer
 
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Quel type de champ pour quel type de données ?

 

Sujets relatifs
[mysql] Comment effacer plusieurs tables à la fois ?Transférer données (manuscrites) vers BDD puis les additionner
[caml] annotation de type[ MySQL ] Requête imbriquée ???
fichier .odt indexé sur table mysql et en phpcomposer une bdd mysql pour creer une plate forme de blog ?
Traitement des données d'un formulaireexport données d'un .db
2 serveurs dédiés et 2 serveur mysql : problème !Tableau de données actualisé avec formulaire
Plus de sujets relatifs à : [MySQL] Quel type de champ pour quel type de données ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR