Je voulais créer un champ vrai/faux si un article est en stock.
Je voulais le définir sur Booléen (qui est converti en tinyint(1)
), 1 pour en stock, 0 pour non en stock.
Je reçois des flux de fournisseurs, alors je me suis dit: "Et s'ils passent combien sont instock?"
Je me suis donc demandé si j'avais inséré un nombre supérieur à 1, que se passerait-il? J'ai supposé qu'il serait par défaut à 1.
À ma grande surprise, cela me permettra de retenir n'importe quel nombre jusqu'à 127, tout dépassement par défaut étant 127.
Quelqu'un peut-il expliquer pourquoi?
Le type de données TINYINT
signé peut stocker des valeurs entières comprises entre -128 et 127.
Cependant, TINYINT(1)
ne modifie pas la valeur minimale ou maximale qu'il peut stocker. Il dit simplement que affiche seulement un chiffre lorsque les valeurs de ce type sont imprimées en sortie.
Le type de données tinyint
utilise 1 octet de stockage. Il est possible de stocker 256 valeurs entières possibles en utilisant 1 octet (-128 à 127). Si vous définissez comme tinyint unsigned
, les valeurs négatives sont ignorées et il est donc possible de les stocker (0 à 255).
Voir ici pour savoir comment MySQL gère cela. Si vous utilisez MySQL> 5.0.5, vous pouvez utiliser BIT
comme type de données (dans les versions antérieures, BIT
serait interprété comme étant TINYINT(1)
. Cependant, la partie (1)
- correspond uniquement à la largeur d'affichage et non à la longueur interne.
CREATE TABLE foo_test(
col_1 TINYINT
, col_2 TINYINT(2)
, col_3 TINYINT(3)
, col_4 TINYINT(2) ZEROFILL
, col_5 TINYINT(3) ZEROFILL
);
INSERT INTO foo_test( col_1,col_2,col_3,col_4,col_5 )
SELECT 1, 1,1,1,1
UNION ALL
SELECT 10, 10,10,10,10
UNION ALL
SELECT 100, 100,100,100,100;
SELECT * FROM foo_test;
**OUTPUT:-**
col_1 col_2 col_3 col_4 col_5
------ ------ ------ ------ --------
1 1 1 01 001
10 10 10 10 010
100 100 100 100 100
MySQL affichera les 0 au début si zerofill est utilisé lors de la création de la table. Si vous n'avez pas utilisé zerofill , il n'est pas efficace.