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

Quel type de champ pour quel type de données ? [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-03-2006 à 11:55:01    

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
Reply

Marsh Posté le 07-03-2006 à 11:55:01   

Reply

Marsh Posté le 08-03-2006 à 16:12:38    

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é

Reply

Marsh Posté le 08-03-2006 à 19:30:07    

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


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 13-03-2006 à 11:11:56    

Reply

Marsh Posté le 27-08-2007 à 20:35:22    


 
Dommage que ce lien ne fonctionne plus.

Reply

Marsh Posté le 27-08-2007 à 20:41:22    

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

Reply

Marsh Posté le 27-08-2007 à 21:55:17    

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 )

Reply

Marsh Posté le 28-08-2007 à 14:24:42    

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.

Reply

Marsh Posté le 28-08-2007 à 14:25:29    

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

Reply

Marsh Posté le 28-08-2007 à 18:36:54    

Je voulais juste un nouveaut site.

Reply

Marsh Posté le 28-08-2007 à 18:36:54   

Reply

Marsh Posté le 29-08-2007 à 09:16:40    

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/
Reply

Marsh Posté le 27-12-2007 à 16:42:52    

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

Reply

Marsh Posté le 27-12-2007 à 16:43:56    

Justement...

Reply

Marsh Posté le 30-12-2007 à 13:28:48    

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...

Reply

Marsh Posté le 02-01-2008 à 14:15:39    

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

Reply

Marsh Posté le 02-01-2008 à 14:26:28    

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
Reply

Marsh Posté le 02-01-2008 à 15:08:33    

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)

Reply

Marsh Posté le 02-01-2008 à 15:16:18    

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]

Reply

Marsh Posté le 02-01-2008 à 15:45:23    

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
Reply

Marsh Posté le 04-01-2008 à 20:39:06    

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

Reply

Marsh Posté le 07-01-2008 à 09:42:54    

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 :)

Reply

Marsh Posté le 19-08-2009 à 11:14:19    

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed