¿Cuál es el tamaño de la columna de int (11) en mysql en bytes?

488

¿Cuál es el tamaño de la columna int(11)en mysql en bytes?

¿Y el valor máximo que se puede almacenar en estas columnas?

Gaurav
fuente
1
Posible duplicado de ¿ Cuál es el tamaño de un SQL Int (N)?
cellepo
1
@cellepo uno es genérico sql el otro es específico para mysql (además este tiene muchas más vistas). Si quieres ir a una cacería de tontos y hacer que los cierre rápidamente en un voto, visita el chat de SOBotics y hazme un ping. Pero el que cierra tiene que ser marcado mysqlantes de mi llegada. Thx
Drew
66
Hola chicos. Posiblemente esté duplicado, pero es más fácil de buscar. La mayoría de la gente busca de esta manera usando int (11). y está resolviendo las preguntas de otras personas. puede verificar su número de vistas comparativo con el otro. y el usuario encontrará una respuesta más detallada aquí.
Gaurav

Respuestas:

685

Un INTsiempre será de 4 bytes sin importar la longitud especificada.

  • TINYINT = 1 byte (8 bits)
  • SMALLINT = 2 bytes (16 bits)
  • MEDIUMINT = 3 bytes (24 bits)
  • INT = 4 bytes (32 bits)
  • BIGINT = 8 bytes (64 bits).

La longitud solo especifica cuántos caracteres rellenar al seleccionar datos con el cliente de línea de comando mysql. 12345 almacenado como int(3)todavía se mostrará como 12345, pero si se almacenó como int(10)todavía se mostrará como 12345, pero tendría la opción de rellenar los primeros cinco dígitos. Por ejemplo, si agregó ZEROFILL, se mostrará como 0000012345.

... y el valor máximo será 2147483647 (Firmado) o 4294967295 (Sin firmar)

Matt MacLean
fuente
111
entonces, ¿qué significa 11 en int (11) aquí.
Gaurav
73
Columna INT (4), el entero 1 se mostrará como 0001 SOLO si la columna también se especifica como zerofill. De lo contrario, solo se mostrará como el número 1, sin dígitos adicionales. @Gaurav: no mezcle cómo mysql muestra los datos y cómo los almacena, esas son dos cosas diferentes. Lo que ves no es lo que realmente podría ser.
Michael JV
13
@ Michael Wow, realmente interesante. Entonces, si crea una columna INT (3) y almacena un valor 5001, almacenará 5001 pero solo mostrará 1. No lo sabía.
andrewtweber
16
@andrewtweber: 5001se mostrará 5001incluso si el campo se define como INT(3). Vea la respuesta de @priyabagus a continuación y aquí .
go2null
10
Si no proporciona una longitud para campos enteros, MySQL establecerá un valor predeterminado (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20) Vale la pena señalar que estas longitudes predeterminadas son suficientes para mostrar cualquier número que se puede almacenar en este campo (por ejemplo: el valor máximo de smallint es 2 ^ 16 = 65536, 5 dígitos) A menos que tenga una muy buena razón para hacerlo, le recomendaría que deje los tamaños predeterminados para evitar sorpresas.
Thibault Witzig
167

INT ( x ) hará la diferencia solo en términos de visualización , es decir, para mostrar el número en x dígitos, y no restringido a 11. Lo empareja usando ZEROFILL, lo que antepondrá los ceros hasta que coincida con su longitud.

Entonces, para cualquier número de x enINT(x)

  • si el valor almacenado tiene menos dígitos que x , ZEROFILLantepondrá ceros.

    INT (5) ZEROFILL con el valor almacenado de 32 mostrará 00032
    INT (5) con el valor almacenado de 32 mostrará 32
    INT con el valor almacenado de 32 mostrará 32

  • Si el valor almacenado tiene más dígitos que x , se mostrará tal como está.

    INT (3) ZEROFILL con el valor almacenado de 250000 mostrará 250000
    INT (3) con el valor almacenado de 250000 mostrará 250000
    INT con el valor almacenado de 250000 mostrará 250000

El valor real almacenado en la base de datos no se ve afectado, el tamaño sigue siendo el mismo y cualquier cálculo se comportará normalmente.

Esto también se aplica a BIGINT, MEDIUMINT, SMALLINT y TINYINT.

priyabagus
fuente
49
Entonces, ¿la longitud no hace absolutamente nada a menos que use zerofill?
developerbmw
29
@developerbmw - Correcto. La longitud no hace absolutamente nada a menos que la use ZEROFILL.
Rick James
ZEROFILL es esencialmente el modo de compatibilidad de mainframe.
Henk Poley
114

Según aquí , int(11)ocupará 4 bytes de espacio, que son 32 bits de espacio con 2^(31) = 2147483648valor máximo y -2147483648valor mínimo. Un bit es para firmar.

Santosh Linkha
fuente
1
Tu ejemplo tiene 9 nueves. ¿Puedes confirmar que tu ejemplo es correcto? Si es así, ¿por qué dice 10 cuando hay 9 nueves? ¿Es el número de dígitos más uno más el carácter del signo?
Homer6
55
No, el número máximo es 4294967295 si no está firmado int, es decir, 2 ^ 32. El número entre paréntesis no afecta el tipo de almacenamiento. Si necesita más de 2 ^ 32, debe ir a bigint.
Kieran Tully
77
O más bien, (2 ^ 32) -1.
Kieran Tully
2
+ Kieran tiene razón. El número máximo es diferente al de la respuesta. Ver aquí
daviewales
38

Como otros han dicho, los valores mínimos / máximos que la columna puede almacenar y la cantidad de almacenamiento que toma en bytes solo se define por el tipo, no por la longitud.

Muchas de estas respuestas dicen que la (11)parte solo afecta el ancho de la pantalla, lo que no es exactamente cierto, sino principalmente.

Una definición int(2)con ningún zerofill especificada hará lo siguiente:

  • todavía acepta un valor de 100
  • todavía muestra un valor de 100cuando la salida (no 0o 00)
  • el ancho de visualización será el ancho del valor más grande que se emite desde la consulta de selección.

Lo único que (2)hará es si también se especifica zerofill :

  • un valor de 1se mostrará 01.
  • Al mostrar valores, la columna siempre tendrá un ancho del valor máximo posible que la columna podría tomar, que es 10 dígitos para un entero, en lugar del ancho mínimo requerido para mostrar el valor más grande que la columna debe mostrar en esa consulta de selección específica , que podría ser mucho más pequeño.
  • La columna aún puede tomar y mostrar un valor que excede la longitud, pero estos valores no tendrán como prefijo 0s.

La mejor manera de ver todos los matices es ejecutar:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

que dará como resultado:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Esta respuesta se prueba con MySQL 5.7.12 para Linux y puede o no variar para otras implementaciones.

Programador
fuente
55
"Observe cómo la columna int1 tiene un ancho de visualización mucho más pequeño que zerofill2 a pesar de que la longitud es mayor" ... Ehm, eso es solo porque el nombre de la columna 'zerofill2' tiene 9 caracteres de largo frente a 'int1' siendo 4.
neokio
2
... sí, entonces la longitud claramente no tiene efecto, incluso en el ancho de la pantalla cuando zerofill no está habilitado. De lo contrario, int1 sería mucho más ancho con un ancho de 10 caracteres.
Programador
2
Una buena explicación con un ejemplo sólido. Respuesta mucho mejor que la aceptada. Gracias @Programster.
Corin
Nit menor: Como señala neokio, no puedo observar de esta consulta las consecuencias exactas de "int (3)" con relleno cero. Acorte el nombre de la columna a "zf2" para aclarar el comportamiento. Específicamente, ya sea verdadero o falso [en una versión de base de datos dada] que "(con zerofill) Al mostrar valores, la columna siempre tendrá un ancho del valor máximo posible que la columna podría tomar, que son 10 dígitos para un número entero",
ToolmakerSteve
1
Para aclarar el comentario de neokio y mi comentario menor: La oración "Observe cómo la columna int1 tiene un ancho de visualización mucho más pequeño que zerofill2 a pesar de que la longitud es mayor". debe ser eliminado de la respuesta. Esa es una consecuencia del número de caracteres en la palabra de encabezado "zerofill2": no tiene nada que ver con probar los anchos de visualización. Es mejor darle a esa columna un nombre más corto, por ejemplo, "zf2". Entonces tendríamos una tabla donde "int1, int2 y zf2 tienen exactamente el mismo ancho, aunque int2 y zf2 especifiquen un ancho pequeño (3)".
ToolmakerSteve
32

¿Cuál es el tamaño de la columna de int (11) en mysql en bytes?

(11)- este atributo de inttipo de datos no tiene nada que ver con el tamaño de la columna. Es solo el ancho de visualización del tipo de datos entero. Desde 11.1.4.5. Atributos de tipo numérico :

MySQL admite una extensión para especificar opcionalmente el ancho de visualización de los tipos de datos enteros entre paréntesis después de la palabra clave base para el tipo. Por ejemplo, INT (4) especifica un INT con un ancho de visualización de cuatro dígitos.

ks1322
fuente
19

Aquí se puede encontrar una buena explicación para

resumir: el número N en int (N) a menudo se confunde con el tamaño máximo permitido para la columna, como lo hace en el caso de varchar (N).

Pero este no es el caso con los tipos de datos Integer: el número N entre paréntesis no es el tamaño máximo de la columna, sino simplemente un parámetro para decirle a MySQL en qué ancho mostrar la columna cuando se visualizan los datos de la tabla a través de MySQL consola (cuando está utilizando el atributo ZEROFILL).

El número entre paréntesis le dirá a MySQL cuántos ceros para rellenar los enteros entrantes. Por ejemplo: si está usando ZEROFILL en una columna que se establece en INT (5) y se inserta el número 78, MySQL rellenará ese valor con ceros hasta que el número satisfaga el número entre paréntesis. es decir, 78 se convertirá en 00078 y 127 se convertirá en 00127. Para resumir: el número entre paréntesis se utiliza para mostrar.
En cierto modo, el número entre paréntesis es algo inútil a menos que esté utilizando el atributo ZEROFILL.

Por lo tanto, el tamaño para el int permanecería igual, es decir, -2147483648 a 2147483648 para firmado y 0 a 4294967295 para no firmado(~ 2.15 billones y 4.2 billones, que es una de las razones por las cuales los desarrolladores no se dan cuenta de la historia detrás del Número N entre paréntesis, ya que apenas afecta a la base de datos a menos que contenga más de 2 billones de filas), y en términos de bytes Sería de 4 bytes .

Para obtener más información sobre el tamaño / rango de los tipos enteros, consulte el manual de MySQL

shashi009
fuente
¿Por qué el número de filas entra en juego aquí?
Old Geezer
@OldGeezer: de acuerdo, "número de filas" es irrelevante para la mayoría de las columnas. Solo es relevante para la columna de clave principal (id) de incremento automático.
ToolmakerSteve
10

Aunque es poco probable que se vea esta respuesta, creo que vale la pena hacer la siguiente aclaración:

  • el (n) detrás de un tipo de datos entero en MySQL especifica el ancho de la pantalla
  • el ancho de la pantalla NO limita la longitud del número devuelto por una consulta
  • el ancho de la pantalla SÍ limita el número de ceros llenos para una columna llena de cero, por lo que el número total coincide con el ancho de la pantalla (siempre que el número real no exceda el ancho de la pantalla, en cuyo caso el número se muestra como está)
  • el ancho de la pantalla también es una herramienta útil para que los desarrolladores sepan a qué longitud se debe rellenar el valor

Un poco de detalle,
el ancho de la pantalla, aparentemente, tiene la intención de proporcionar algunos metadatos sobre cuántos ceros mostrar en un número relleno con cero.
En realidad, NO limita la longitud de un número devuelto por una consulta si ese número supera el ancho de visualización especificado.
Para saber qué longitud / ancho se permite realmente para un tipo de datos entero en MySQL, consulte la lista y el enlace: ( tipos: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Dicho esto, puede esperar que el ancho de la pantalla no afecte los resultados de una consulta estándar, a menos que las columnas se especifiquen como columnas ZEROFILL
O
en el caso de que los datos se envíen a una aplicación y esa aplicación esté recopilando ancho de pantalla a utilizar para algún otro tipo de relleno.

Referencia principal: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

MER
fuente
Gracias por proporcionar la respuesta adecuada. Estaba intentando desde la línea de comandos de MySQL, y no pude hacer que cortara ningún dígito con pequeños n, así que ... sí, eso es una tontería. Solo hace algo con zerofill.
mpen
@mpen me alegro de poder ayudar, esto estaba relacionado con algo que estaba intentando y pensé que podría poner más detalles al respecto aquí que podrían ser útiles para otra persona.
MER
9

En MySQL, el número entero int(11)tiene un tamaño de 4 bytes, lo que equivale a 32 bits.

El valor firmado es: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Los valores sin signo son: 0 to 2^32-1 = 0 to 4294967295

Sachin Agrawal
fuente
0

de acuerdo con este libro :

MySQL le permite especificar un "ancho" para los tipos enteros, como INT (11). Esto no tiene sentido para la mayoría de las aplicaciones: no restringe el rango legal de valores, sino que simplemente especifica el número de caracteres que las herramientas interactivas de MySQL reservarán para fines de visualización. Para fines de almacenamiento y computacionales, INT (1) es idéntico a INT (20).

Alireza Rahmani Khalili
fuente
-4

Creo que el valor máximo de int (11) es 4294967295

Samuel
fuente
2
Es 2147483647 porque tiene signo.
d3bit
-9

4294967295 es la respuesta, porque int (11) muestra un máximo de 11 dígitos IMO

Dudee
fuente