2010-06-28 21 views
143

Me preguntaba cuál era la diferencia entre BigInt, MediumInt y Int ... parece obvio que permitirían números más grandes; sin embargo, puedo hacer un Int(20) o un BigInt(20) y eso parecería que no es necesariamente sobre el tamaño.Tipos en MySQL: BigInt (20) vs Int (20)

Algunas ideas serían increíbles, solo un poco curiosas. He estado usando MySQL por un tiempo e intento aplicar las necesidades empresariales al elegir tipos, pero nunca entendí este aspecto.

Respuesta

304

Ver http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

  • INT es un entero con signo de cuatro bytes.

  • BIGINT es un entero de ocho bytes con signo.

No aceptan ni más ni menos valores de los que se pueden almacenar en sus respectivos bytes. Eso significa 2 valores en un INT y 2 valores en un BIGINT.

El 20 en INT(20) y BIGINT(20) significa casi nada. Es una pista para el ancho de la pantalla. No tiene nada que ver con el almacenamiento ni con el rango de valores que aceptará la columna.

Prácticamente, que sólo afecta a la opción ZEROFILL:

CREATE TABLE foo (bar INT(20) ZEROFILL); 
INSERT INTO foo (bar) VALUES (1234); 
SELECT bar from foo; 

+----------------------+ 
| bar     | 
+----------------------+ 
| 000000000000000| 
+----------------------+ 

Es una fuente común de confusión para los usuarios de MySQL para ver INT(20) y asumen que es un límite de tamaño, algo análogo a CHAR(20). Este no es el caso.

+1

Guau, este artículo aclara mi confusión sobre este tema a la perfección. Parece una elección extraña para los desarrolladores, ya que habría adivinado que era ancho + valor máximo, o bits/etc. – Sh4d0wsPlyr

+7

'afecta solo a la opción ZEROFILL:' ahora mi curiosidad termina – Umair

+2

Realmente me gustaría que hayan diseñado la sintaxis con la pantalla con ZEROFILL en lugar de INT. Ejemplo: 'barra INT ZEROFILL (20)'. Hubiera sido mucho más claro. Pero esa decisión se tomó hace mucho tiempo, y cambiarla ahora rompería millones de instalaciones de bases de datos. –

34

El número entre paréntesis en una declaración de tipo es ancho de pantalla, que no está relacionado con el rango de valores que se pueden almacenar en un tipo de datos. El hecho de que se puede declarar Int(20) no significa que usted puede almacenar valores de hasta 10^20 en el que:

[...] Este ancho de la pantalla opcional puede ser utilizado por las aplicaciones para mostrar los valores de número entero que tiene una anchura inferior a el ancho especificado para la columna al margen izquierdo con espacios. ...

El ancho de visualización no limita el rango de valores que pueden almacenarse en la columna, ni el número de dígitos que se muestran para valores que tienen un ancho que excede el especificado para la columna. Por ejemplo, una columna especificada como SMALLINT (3) tiene el rango SMALLINT habitual de -32768 a 32767, y los valores fuera del rango permitido por tres caracteres se muestran con más de tres caracteres.

Para obtener una lista de los valores máximo y mínimo que se puede almacenar en cada tipo de datos MySQL, ver here.

+1

¿Quiere decir [aquí] (http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)? – WAF

12

Quote:

El "BIGINT (20)" especificación no es un límite de dígitos. Simplemente significa que cuando se muestren los datos, si usa menos de 20 dígitos, se rellenará con ceros. 2^64 es el límite estricto para el tipo BIGINT, y tiene 20 dígitos, por lo tanto, BIGINT (20) solo significa que menos de 10^20 se rellenarán con espacios en pantalla.

+2

2^64 (sin firmar) en realidad tiene 21 dígitos. BIGINT (20) es peligroso. Las personas que lo usan parecen justificar su uso con la idea de que 2^64 cabe en 20 dígitos decimales. Si ese es el caso, ¿por qué especificar un límite de ancho en absoluto? Como resultado, eso tampoco es correcto. Se necesitan 21 dígitos para mostrar correctamente 2^64. –

1

que quería añadir un punto más es, si está almacenando un muy gran número 902054990011312, como entonces uno puede ver fácilmente la diferencia de INT(20) y BIGINT(20). Es recomendable almacenar en BIGINT.

0

Por lo que sé, solo hay una pequeña diferencia cuando está tratando de insertar un valor que está fuera del rango.

En los ejemplos voy a utilizar 401421228216, que es 101110101110110100100011101100010111000 (longitud caracteres)

  • Si tiene INT(20) para el sistema, esto significa asignar en la memoria mínimo 20 bits. Pero si va a insertar valor que más grande que 2^20, se almacenará con éxito, sólo si es menos de INT(32) -> 2147483647 (o 2 * INT(32) -> 4294967295 para UNSIGNED)

Ejemplo:

mysql> describe `test`; 
+-------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+------------------+------+-----+---------+-------+ 
| id | int(20) unsigned | YES |  | NULL |  | 
+-------+------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
ERROR 1264 (22003): Out of range value for column 'id' at row 1 

mysql> SET sql_mode = ''; 
Query OK, 0 rows affected, 1 warning (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected, 1 warning (0,06 sec) 

mysql> SELECT * FROM `test`; 
+------------+ 
| id   | 
+------------+ 
| 4294967295 | 
+------------+ 
1 row in set (0,00 sec) 
  • Si usted tiene BIGINT(20) para el sistema esto significa asignar en la memoria un mínimo de 20 bits. Pero si va a insertar valor que más grande que 2^20, se ha almacenado correctamente, si es menos de BIGINT(64) -> 9223372036854775807 (o 2 * BIGINT(64) -> 18446744073709551615 para UNSIGNED)

Ejemplo:

mysql> describe `test`; 
+-------+---------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+---------------------+------+-----+---------+-------+ 
| id | bigint(20) unsigned | YES |  | NULL |  | 
+-------+---------------------+------+-----+---------+-------+ 
1 row in set (0,00 sec) 

mysql> INSERT INTO `test` (`id`) VALUES (401421228216); 
Query OK, 1 row affected (0,04 sec) 

mysql> SELECT * FROM `test`; 
+--------------+ 
| id   | 
+--------------+ 
| 401421228216 | 
+--------------+ 
1 row in set (0,00 sec)