web-dev-qa-db-fra.com

MySQL Boolean "tinyint (1)" contient des valeurs allant jusqu'à 127?

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?

36
JD Isaacks

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.

56
BoltClock

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

7
Nathan

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.

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

0
Rabeel Javed