sql >> Base de Datos >  >> Database Tools >> phpMyAdmin

¿Por qué TINYINT(1) funciona como booleano pero INT(1) no?

El (1) entre paréntesis para un tipo entero de MySQL no tiene nada que ver con el rango de valores aceptado por el tipo de datos, o cómo se almacena. Es solo para exhibición.

Consulte también mi respuesta a Types in MySQL:BigInt(20) frente a Int(20), etc. .

TINYINT no es diferente de TINYINT(1) o TINYINT(2) o TINYINT(64). Es un tipo de datos entero con signo de 8 bits y acepta cualquier valor entero de 8 bits de -128 a 127.

mysql> create table b (i tinyint(1));

mysql> insert into b values (42);

mysql> select * from b;
+------+
| i    |
+------+
|   42 |
+------+

Por comodidad, MySQL admite un alias para BOOL, que se reemplaza inmediatamente por TINYINT(1).

mysql> create table b2 (i bool);

mysql> show create table b2;

CREATE TABLE `b2` (
  `i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Como dije, el uso de (1) no significa casi nada, es solo una convención, por lo que si ve TINYINT(1) es razonable asumir que la columna pretende para ser utilizado como un booleano. Pero nada en MySQL le impide almacenar otros valores enteros en él.

Si desea que una columna acepte solo 0 o 1, puede usar BIT(1):

mysql> create table b3 (i bit(1));

mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1

mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1

Sin embargo, esto no ahorra espacio en comparación con TINYINT, porque el almacenamiento de una columna dada se redondea al byte más cercano.

PD:a pesar de la respuesta de @samdy1, TINYINT no almacena cadenas '0' o '1' en absoluto, almacena enteros 0 o 1 , así como otros números enteros de -128 a 127. No es necesario citar números enteros en SQL y, a menudo, me sorprende que tantos desarrolladores lo hagan.