question existentielle MySQL : INT(x)

question existentielle MySQL : INT(x) - SQL/NoSQL - Programmation

Marsh Posté le 26-08-2005 à 15:05:15    

Bonjour, je viens d'apprendre que le chiffre spécifié dans les parenthèses d'un INT(X) dans MySql n'affecte pas la taille du champ mais simplement la taille d'affichage des résultats, d'où une question que je me pose et à laquelle je trouve aucune réponse, quel intéret ?
 
Merci  :pt1cable:

Reply

Marsh Posté le 26-08-2005 à 15:05:15   

Reply

Marsh Posté le 26-08-2005 à 15:17:49    

Pas compris ?
int(1) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
int(2) = 0, 1, 2, 3, 4, ..., 99
int(3) = 0, 1, 2, 3, 4, ..., 999
Etc...

Reply

Marsh Posté le 26-08-2005 à 15:36:45    

Masenko a écrit :

Pas compris ?
int(1) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
int(2) = 0, 1, 2, 3, 4, ..., 99
int(3) = 0, 1, 2, 3, 4, ..., 999
Etc...


 :non: int(1) = int(2) = int(3) = int(X)  
dans tous les cas un champ INT sous MySQL gère jusqu'a 2^32 (4 octets)
 
en réalité il ne sert que pour le formattage des résultats :
exemple :
tu as dans la base :
1
10
100
1000
10000
100000
 
avec INT(3) et ZEROFILL activé (pour que ce soit visible)
tu auras apres un select :
001
010
100
1000
10000
100000
 
d'où ma question d'en connaitre l'intéret...

Reply

Marsh Posté le 26-08-2005 à 15:47:51    

Tu viens de le dire j'imagine. C'est le fait d'avoir les champs rempli d'une certaine maniere.
Imagine une date : 01.02.2003 , on peut l'abbreger 01.02.03 , maintenant sans zerofill et int 2 :
1,2,3 ... Ca le fait pas trop comme date ..
 
Du moins c'est la conclusion a laquelle je suis arrivé


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-08-2005 à 15:50:54    

esox_ch a écrit :

Tu viens de le dire j'imagine. C'est le fait d'avoir les champs rempli d'une certaine maniere.
Imagine une date : 01.02.2003 , on peut l'abbreger 01.02.03 , maintenant sans zerofill et int 2 :
1,2,3 ... Ca le fait pas trop comme date ..
 
Du moins c'est la conclusion a laquelle je suis arrivé


oui il doit certainement y avoir des applications concrètes, mais je ne vois vraiment pas quoi, et pour une date...

Reply

Marsh Posté le 26-08-2005 à 16:15:06    

Ha oui me suis trompé effectivement ;p

Reply

Marsh Posté le 30-08-2005 à 19:58:40    

Masenko a écrit :

Pas compris ?
int(1) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
int(2) = 0, 1, 2, 3, 4, ..., 99
int(3) = 0, 1, 2, 3, 4, ..., 999
Etc...


tu parles du type numeric (ou number selon les SGBD) là...

Reply

Marsh Posté le 30-08-2005 à 20:00:33    

Sinon, ça me semble un bug de MySQL ça.
 
Parceque la norme SQL prévoit que le nombre passé en paramètre à INT soit le nombre de bits utilisés pour représenter l'entier (là où le paramètre représente le nombre de chiffres avec le type numeric)

Reply

Marsh Posté le 30-08-2005 à 20:05:23    

Arf, non, même pas, le type INT ne recois pas de paramètres, et est un 32 bits signé dans la norme SQL.
SQL Server accepte un paramètre, "4", correspondant à 4 octets, donc 32 bits. Ce paramètre est constant et ne peut être modifié.
 
Bref, les dévelopeurs de MySQL ont fumé sur ce coup là !

Reply

Marsh Posté le 30-08-2005 à 20:05:56    

Ou alors, il ne font que permettre de passer un paramètre, qui est tout bonnement ignoré.
 

esox_ch a écrit :

Tu viens de le dire j'imagine. C'est le fait d'avoir les champs rempli d'une certaine maniere.
Imagine une date : 01.02.2003 , on peut l'abbreger 01.02.03 , maintenant sans zerofill et int 2 :
1,2,3 ... Ca le fait pas trop comme date ..
 
Du moins c'est la conclusion a laquelle je suis arrivé


Euh... Une date, ça se stocke de toute façon jamais comme ça dans la base !
 
Soit tu as un type DATETIME, et tu l'utilises.
Soit tu n'en as pas, et tu utilises le format ISO : "YYYYMMDD HH:MI:SS" au format CHAR(8) ou CHAR(17) selon si tu veux l'heure ou non. En aucun cas sous forme d'un INT !
 
A la limite, tu peux stocker dans un format INT uniquement la valeur illisible résultat d'un CAST vers le type INT d'une variable DATETIME (il va contenir la représentation interne, au format DATETIME, de la date sans l'heure).
En effet, un DATETIME, c'est un bête float, dont la partie entière représente la date, et la partie décimale l'heure. Un cast vers INT permet donc de ne garder que la partie date, et économiser un peu de place.


Message édité par Arjuna le 30-08-2005 à 20:09:54
Reply

Marsh Posté le 30-08-2005 à 20:05:56   

Reply

Marsh Posté le 30-08-2005 à 20:27:29    

Je sais ... je cherchais juste une explication .. et c'est la moins stupide qui me soit venue a l'esprit ...
 


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 12:01:48    

Sinon, juste un truc à propos de mon dernier post à propos des dates.
 
Je viens de vérifier dans SQL Server, et il accepte les transtypages vers le type interne "float".
 
Ainsi :

Code :
  1. -- Récupération du jour sans l'heure
  2. select cast(floor(cast(getdate() as float)) as datetime)
  3. -- Récuparation de l'heure sans jour (01/01/1900)
  4. select cast((cast(getdate() as float) - floor(cast(getdate() as float))) as datetime)


 

Code :
  1. ------------------------------------------------------
  2. 2005-09-01 00:00:00.000
  3. (1 ligne(s) affectée(s))
  4.                                                      
  5. ------------------------------------------------------
  6. 1900-01-01 11:49:58.177
  7. (1 ligne(s) affectée(s))


Message édité par Arjuna le 01-09-2005 à 12:06:47
Reply

Marsh Posté le 01-09-2005 à 12:03:08    

A noter qu'avec MySQL, ça ne marche pas, puisque ce dernier ne travaille pas avec le type système "date", mais avec des timestamp (dates à la sauce Unix et non Microsoft / ISO).
Un timestamp est un double (32 bits) contenant le nombre de millisecondes depuis je ne sais plus quelle date (je crois pas que ce soit 01/01/1900 comme Microsoft)
Donc on obtiens la date en faisant une division par 1000 * 60 * 60 * 24
Et l'heure avec un modulo 1000 * 60 * 60 * 24


Message édité par Arjuna le 01-09-2005 à 12:03:54
Reply

Marsh Posté le 01-09-2005 à 12:16:42    

Non le timestamp unix commance dans les années 70 si je me rappelle bien...
 
Edit :  

Citation :

L'intervalle de validité d'un timestamp va généralement du Vendredi 13 Décembre 1901 20:45:54 GMT au Mardi 19 Janvier 2038 03:14:07 GMT. (Ces dates correspondent aux valeurs minimales et maximales des entiers 32 bits non-signés). Sur les systèmes Windows, cette intervalle va du 01-01-1970 au 19-01-2038.


 
Tirer de la fonction date de php qui est basée apperemment sur mysql


Message édité par esox_ch le 01-09-2005 à 12:19:23

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 12:18:19    

c'est bien ce qu'il me semblait ;)

Reply

Marsh Posté le 01-09-2005 à 12:59:29    

Arjuna a écrit :

Sinon, ça me semble un bug de MySQL ça.
 
Parceque la norme SQL prévoit que le nombre passé en paramètre à INT soit le nombre de bits utilisés pour représenter l'entier (là où le paramètre représente le nombre de chiffres avec le type numeric)


Citation :

Bref, les dévelopeurs de MySQL ont fumé sur ce coup là !


 
disons qu'ils ont plutot interprété à leur sauce, puisque la doc MySQL explique à quoi sert le chiffre passé en paramètre, que j'ai illustré d'un exemple plus haut...
 
Donc soit ils ont fumé, soit il y a une réelle utilisation possible de cette fonctionnalité, mais je cherche encore laquelle...


Message édité par misterpinguin le 01-09-2005 à 13:00:02
Reply

Marsh Posté le 01-09-2005 à 13:02:00    

esox_ch a écrit :

Non le timestamp unix commance dans les années 70 si je me rappelle bien...
 
Edit :  

Citation :

L'intervalle de validité d'un timestamp va généralement du Vendredi 13 Décembre 1901 20:45:54 GMT au Mardi 19 Janvier 2038 03:14:07 GMT. (Ces dates correspondent aux valeurs minimales et maximales des entiers 32 bits non-signés). Sur les systèmes Windows, cette intervalle va du 01-01-1970 au 19-01-2038.


 
Tirer de la fonction date de php qui est basée apperemment sur mysql


 
eh oui, plus que 33 ans avant le bug...  :D

Reply

Marsh Posté le 01-09-2005 à 13:07:44    

Mouais :p ... Ca va encore etre un truc comme le 9 septembre 99 ou le millenium bug ... 1 grand coup de fumée dans les yeux :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 13:09:08    

esox_ch a écrit :

Mouais :p ... Ca va encore etre un truc comme le 9 septembre 99 ou le millenium bug ... 1 grand coup de fumée dans les yeux :D


et un grand coup de cash dans nos poches pour tout plein de patchs  :ange:

Reply

Marsh Posté le 01-09-2005 à 13:11:19    

Oue sauf qu'il faudrait que ca pete vraiment fort pour que ce soit rentable :D.
 
Et d'ailleur la pluspart des site n'utilise pas le timestamp tel quel (seul les geeks le font apperemment [:petrus75]), donc suffi que PHP relache un patch pour date() et hop, on a plus rien dans nos poches


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 14:11:59    

que veux tu dire par "la pluspart des site n'utilise pas le timestamp tel quel " il y en a qui affichent "Bonjour, il est 21479272 secondes de plus que le 1er janvier 1970" ???  :whistle:

Reply

Marsh Posté le 01-09-2005 à 14:34:18    

Non, ca veut dire que si tu vas dans la base de donnée / fichier de cache, ils ont stoquer 1er janvier 1970 plutot que 0 ... Et 10 min apres le webmaster arrive ici en pleurant parcequ'il arrive pas a calculer une date ... et oui c'est dur la vie quand on utilise pas le timestamp


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 14:34:43    

esox_ch a écrit :

Mouais :p ... Ca va encore etre un truc comme le 9 septembre 99 ou le millenium bug ... 1 grand coup de fumée dans les yeux :D


d'où l'intérêt de gérer les dates comme le préconise ISO, en format texte : "YYYYMMDD HH:MI:SS mmm"
 
Ca plantera le 31 décembre 9999 à 23h59 et 59,999 secondes, on a vraiment le temps de voir venir :D

Reply

Marsh Posté le 01-09-2005 à 14:35:57    

Et l'intérêt, c'est qu'on peut traîter de le moyen-age aussi, sans nécessiter des astuces bidons de ouf :)

Reply

Marsh Posté le 01-09-2005 à 14:40:51    

Arjuna a écrit :

Et l'intérêt, c'est qu'on peut traîter de le moyen-age aussi, sans nécessiter des astuces bidons de ouf :)


et avant JC tu fais comment ?  [:misterpinguin]


Message édité par misterpinguin le 01-09-2005 à 14:41:04
Reply

Marsh Posté le 01-09-2005 à 14:44:51    

Arjuna a écrit :

d'où l'intérêt de gérer les dates comme le préconise ISO, en format texte : "YYYYMMDD HH:MI:SS mmm"
 
Ca plantera le 31 décembre 9999 à 23h59 et 59,999 secondes, on a vraiment le temps de voir venir :D


 
Oue mais le timestamp c'est bien utile quand meme.. Rien a fouttre des mois de fevrier & co ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 01-09-2005 à 14:49:21    

Sinon, euh...
Y'a un souci avec la citation d'esox_ch...
 
Je suis sous NT 4.0 SP6 et :
 

Code :
  1. select cast(null as datetime)
  2. select cast(0 as datetime)
  3. select cast(1 as datetime)
  4. select cast(2 as datetime)
  5. select cast(-1 as datetime)
  6. select cast(-10000 as datetime)


 

Code :
  1. ------------------------------------------------------
  2. NULL
  3. (1 ligne(s) affectée(s))
  4.                                                      
  5. ------------------------------------------------------
  6. 1900-01-01 00:00:00.000
  7. (1 ligne(s) affectée(s))
  8.                                                      
  9. ------------------------------------------------------
  10. 1900-01-02 00:00:00.000
  11. (1 ligne(s) affectée(s))
  12.                                                      
  13. ------------------------------------------------------
  14. 1900-01-03 00:00:00.000
  15. (1 ligne(s) affectée(s))
  16.                                                      
  17. ------------------------------------------------------
  18. 1899-12-31 00:00:00.000
  19. (1 ligne(s) affectée(s))
  20.                                                      
  21. ------------------------------------------------------
  22. 1872-08-15 00:00:00.000
  23. (1 ligne(s) affectée(s))


 
=> SQL Server part donc de 1900 et non pas de 1970. Vu que c'est un produit Microsoft, j'en déduis qu'ils ont certainement utilisé le type système.
=> A noter que vu que c'est un float, il est signé, et du coup on peut modéliser des dates antérieures à 1900
 
 
Et avec VBS :

Code :
  1. msgbox CDate(0)
  2. msgbox CDate(1)
  3. msgbox CDate(2)
  4. msgbox CDate(-1)
  5. msgbox CDate(-10)


 

Code :
  1. 00:00:00 (c'est aussi 30/12/1899)
  2. 31/12/1899
  3. 01/01/1900
  4. 29/12/1899
  5. 20/12/1899


 
Idem donc, sauf qu'il commence à compter deux jour avant (étrange :D)


Message édité par Arjuna le 01-09-2005 à 14:52:55
Reply

Marsh Posté le 01-09-2005 à 14:50:09    

misterpinguin a écrit :

et avant JC tu fais comment ?  [:misterpinguin]


Ben au pire, tu peut toujours mettre un - devant. La notation avec sciècle le permet certainement d'ailleurs :p

Reply

Marsh Posté le 01-09-2005 à 14:51:34    

esox_ch a écrit :

Oue mais le timestamp c'est bien utile quand meme.. Rien a fouttre des mois de fevrier & co ...


Tout dépends de l'utilisation... Mais moi je préfère très franchement utiliser ce format.
Plus facile pour retrouver "le 1° jour du mois suivant".
Parceque avec MySQL et un timestamp, je te raconte pas la requête de timbré que ça fait, pour vraiment pas grand chose ;))

Reply

Marsh Posté le 01-09-2005 à 14:53:15    

Ok donc avec ton castage, le systeme va se demerder pour les années bisextiles & co...
Pratique en effet


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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