Pourquoi TINYINT (1) fonctionne-t-il comme un booléen mais INT (1) ne le fait pas?
Pourquoi ne TINYINT(1)
travail comme une valeur booléenne? La j'ai compris de l'officiel de docs, (1), il faut dire qu'il a une largeur de 1, donc si je magasin 56
j'ai pensé qu'il doit imprimer 5
. Mais pour quelque raison, il imprime 1
ou 0
.
Et un autre cas est que si je magasin 56
dans un INT(1)
puis il imprime 56
(au moins selon SQLFiddle). Ce qui se passe ici?
source d'informationauteur argoneus
Vous devez vous connecter pour publier un commentaire.
L' (1) entre parenthèses pour un MySQL de type entier n'a rien à voir avec la plage de valeurs admises par le type de données, ou comment elle est stockée. C'est uniquement pour l'affichage.
Voir aussi ma réponse à Types de MySQL: BigInt(20) - Int(20), etc.
TINYINT n'est pas différent de TINYINT(1) ou de type TINYINT(2) ou de type TINYINT(64). C'est un 8 bits entier signé de type de données, et il accepte tout entier 8 bits de la valeur de -128 à 127.
Pour des raisons de commodité, MySQL supporte un alias pour le type BOOL, qui est remplacé immédiatement par TINYINT(1).
Comme je l'ai dit, l'utilisation de (1) à presque rien, c'est seulement une convention de sorte que si vous voyez TINYINT(1) il est raisonnable de supposer que la colonne est prévu pour être utilisé comme un booléen. Mais rien dans MySQL vous empêche de stocker d'autres valeurs entières.
Si vous voulez une colonne d'accepter seulement 0 ou 1, vous pouvez utiliser BIT(1):
Cela ne veut pas sauver tout l'espace par rapport à TINYINT, parce que le stockage pour une colonne donnée tours jusqu'à la plus proche de l'octet.
PS: Malgré la réponse de @samdy1, TINYINT ne pas stocker chaînes
'0'
ou'1'
à tous, il stocke entiers0
ou1
ainsi que d'autres entiers allant de -128 à 127. Il n'est pas besoin de citer des entiers en SQL, et je suis souvent perplexe pourquoi donc beaucoup de développeurs ne.TINYINT
colonnes peut stocker des nombres de-128
à127
.TINYINT(1)
est un peu bizarre. C'est (peut-être parce qu'il est censé agir comme unBOOLEAN
datatype), renvoie uniquement0
et1
dans un certain contexte, bien qu'il conserve encore l'stockées (-128 à 127) les valeurs.(Correction: je ne vois que ce comportement bizarre dans SQL Violon et pas lors de l'accès à MySQL en local, donc il peut très bien être un SQL-Violon caprices, peut-être liés à l'quivalence avec
BOOLEAN
) et pas MySQL est un problème.Voir le SQL-Violon
Où nous obtenons (uniquement dans SQL Violon, pas si nous avons accès à MySQL autrement!):
mais:
C'est un Jdbc mysql configuration de l'objet.
Vous pouvez config mysql jdbc pour convertir TinyInt(1) ou Booléen Entier via l'url jdbc config propriété "tinyInt1isBit" à "true" (par défaut) ou "false".
à partir de: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
Si le pilote de traiter le type de données de type TINYINT(1) comme le type de BIT (parce que le serveur silencieusement convertit PEU -> TINYINT(1) lors de la création de tables)?
Par défaut: true
Le moteur est assez intelligent pour savoir que
TINYINT(1)
etBOOL
sont les mêmes. CependantINT(1)
affecte uniquement l'Affichage de la Largeur de la place de la sous-jacentes de la taille de stockage. Largeur d'affichage n'est mise en jeu lorsque la valeur est moins de la largeur puis la largeur de l'affichage. Ensuite, il se rembourré.http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/
Comme je le comprends,
TINYINT(1)
ne peut contenir'0'
ou'1'
(à partir de sa propre expérience).Ainsi, on peut supposer que l'
'0'
ou'1'
est traduit entrue
oufalse
.