MySql: Tinyint (2) vs tinyint (1): ¿cuál es la diferencia?

183

Sabía booleano en mysql como tinyint (1).

Hoy veo una mesa con un entero definido como tinyint(2), y también otros como int(4), int(6)...

¿Qué significa el tamaño en el campo de tipo entero y tinyint?

Realtebo
fuente
44
Lea sobre los tipos de datos de MySQL Integer aquí .
Bud Damyanov
2
La respuesta de @ AamirR es la correcta
evilReiko
1
@evilReiko zerofill tampoco hace una diferencia en cómo se almacena el valor, realmente se trata de la presentación ... los espacios o ceros realmente no hacen una diferencia en la exactitud de la respuesta de nadie imo
Jaock

Respuestas:

94

Significa ancho de pantalla

Ya sea que use tinyint (1) o tinyint (2), no hace ninguna diferencia.

Siempre uso tinyint (1) e int (11), usé varios clientes mysql (navicat, secuela pro).

¡No significa nada en absoluto! Ejecuté una prueba, todos los clientes anteriores o incluso el cliente de línea de comandos parecen ignorar esto.

Pero, el ancho de visualización es más importante si está utilizando la ZEROFILLopción, por ejemplo, su tabla tiene las siguientes 2 columnas:

Un tinyint (2) zerofill

B tinyint (4) zerofill

ambas columnas tienen el valor de 1, la salida para la columna A sería 01y 0001para B , como se ve en la captura de pantalla a continuación :)

zerofill con ancho de pantalla

AamirR
fuente
20
Por extraño que parezca, acabo de descubrir que en el conector MySQL oficial de C # tinyint (1) nunca devuelve valores diferentes de 0 y 1. Esto probablemente tiene que ver con que tinyint (1) se reconozca automáticamente como un valor booleano. Solo un aviso, a veces importa.
Daniel Sharp
¿No es mejor usar un tipo entero y una longitud lo más pequeños posible? Tenía la impresión de que esto guardaba memoria en MySQL.
nclsvh
Como señala @ Daniel-Sharp, podría parecer importante para los conectores. Acabo de tener un problema con Hibernate al usar JDBC informando que interpretó un TINYINT (1) como un BIT.
sfj
2
@DanielSharp que probablemente se deba a la opción de conexión tinyInt1isBit que por defecto es verdadera. Ver dev.mysql.com/doc/connector-j/8.0/en/...
Parisbre56
1
Siempre pensé que esto tenía algo que ver con la cantidad de números aceptados (por ejemplo, int (4) que no permite nada por encima de 9999). Supongo que siempre pensé mal entonces. Tanto en la línea de comando de PHP como de MySQL, veo que el valor de arriba está bien.
Joshua Bakker
226

El (m)indica el ancho de visualización de la columna; aplicaciones como el cliente MySQL hacen uso de esto cuando muestran los resultados de la consulta.

Por ejemplo:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Aquí a, by cestán usando TINYINT(1), TINYINT(2)y TINYINT(3)respectivamente. Como puede ver, rellena los valores en el lado izquierdo utilizando el ancho de la pantalla.

Es importante tener en cuenta que no afecta el rango aceptado de valores para ese tipo en particular, es decir, TINYINT(1)todavía acepta [-128 .. 127].

Jack
fuente
16
¿Qué significa 'ancho de columna'?
realtebo
8
@realtebo es utilizado principalmente por el cliente de línea de comandos mysql para fines de visualización.
Ja͢ck
3
El número de "dígitos" que muestra la interfaz. En otras palabras, rellenará ceros a la izquierda. Este tipo de característica tenía sentido en los primeros días de las bases de datos, pero ahora es solo un legado.
Denilson Sá Maia
2
@Kailas Si no estás usando el cliente mysql? Ninguno en absoluto.
Ja͢ck
11
@Kailas ¡No! tinyint (1) no acepta solo 0-9. Acepta todo el rango de lo que tinyint puede contener.
Ja͢ck
18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
zloctb
fuente
11
Edite su respuesta para incluir alguna explicación. Las respuestas de solo código hacen muy poco para educar a los futuros lectores de SO. Su respuesta está en la cola de moderación por ser de baja calidad.
mickmackusa
14

Acerca de INT, TINYINT ... Estos son diferentes tipos de datos, INT es un número de 4 bytes, TINYINT es un número de 1 byte. Más información aquí: INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

La sintaxis del tipo de datos TINYINT es TINYINT (M), donde M indica el ancho máximo de visualización (solo se usa si su cliente MySQL lo admite).

Atributos de tipo numérico .

Devastar
fuente
1
¿Qué significa 'ancho de pantalla'?
realtebo
2
De la referencia: por ejemplo, INT (4) especifica un INT con un ancho de visualización de cuatro dígitos. Las aplicaciones pueden usar este ancho de visualización opcional para mostrar valores enteros que tengan un ancho menor que el ancho especificado para la columna al rellenarlos con espacios a la izquierda.
Devart
2
Pero no he visto aplicaciones o clientes MySQL que usen esta función. Siempre uso INT (11) y uso funciones de formato para personalizar la salida.
Devart