¿Cuál es el significado de tinyint (N)?

17

Cuando usamos una longitud de argumento con tipos de datos numéricos, hasta donde yo sé, esto especifica el ancho de la pantalla.
Intenté lo siguiente:

mysql> create table boolean_test (var1 boolean, var2 tinyint);    
Query OK, 0 rows affected (0.10 sec)   

mysql> show create table boolean_test;   
+--------------+-------------------------   
| Table        | Create Table
+--------------+-------------------------  
| boolean_test | CREATE TABLE `boolean_test` (  
  `var1` tinyint(1) DEFAULT NULL,  
  `var2` tinyint(4) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |   
+--------------+---------------------------  
1 row in set (0.00 sec)  

En primer lugar, tinyint es un valor de 1 byte. Entonces, ¿cuál es el significado de tinyint(4)? No puede haber 4 dígitos.

mysql> insert into boolean_test values(101,112);  
Query OK, 1 row affected (0.03 sec)   

mysql> select * from boolean_test;  
+------+------+  
| var1 | var2 |  
+------+------+  
|   10 |  112 |  
|  101 |  112 |  
+------+------+  
2 rows in set (0.00 sec)  

Veo que en tinyint almacené un 10 y 101 y pude recuperar estos valores a pesar de que se define como tinyint (1).
¿No debería ver un 1 para var1? Es decir, solo 1 dígitos de visualización?

Cratilo
fuente
¿Por qué tienes dos filas después de una inserción? No puedo comprender completamente este código.
WoodrowShigeru

Respuestas:

24

En cuanto a los datos, tinyint(1), tinyint(2), tinyint(3)etc, todos ellos exactamente lo mismo. Todos están en el rango -128 a 127 para SIGNEDo 0-255 para UNSIGNED. Como señalaron otras respuestas, el número entre paréntesis es simplemente una pista de ancho de pantalla.

Sin embargo, es posible que desee tener en cuenta que la aplicación = las cosas sabias pueden verse diferentes. Aquí, tinyint(1)puede tener un significado especial. Por ejemplo, el Conector / J (conector Java) trata tinyint(1)como un valor booleano y, en lugar de devolver un resultado numérico a la aplicación, convierte los valores en truey false. Esto se puede cambiar a través del tinyInt1isBit=falseparámetro de conexión.

Shlomi Noach
fuente
13

Un tinyint (1) puede contener números en el rango de -128 a 127, debido a que el tipo de datos es de 8 bits (1 byte); obviamente, un tinyint sin signo puede contener valores 0-255.

Silenciosamente se truncará fuera de los valores de rango:

mysql> create table a
    -> (
    ->    ttt tinyint(1)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from a;
+------+
| ttt  |
+------+
|  127 |
| -128 |
|  127 |
| -128 |
+------+
4 rows in set (0.00 sec)

mysql>

... a menos que cambie sql_modeo cambie la configuración del servidor:

mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>

El valor utilizado en el DDL para el tipo de datos (por ejemplo: tinyint (1)) es, como sospechaba, el ancho de la pantalla. Sin embargo, es opcional y los clientes no tienen que usarlo. El cliente MySQL estándar no lo usa, por ejemplo.

Philᵀᴹ
fuente