Tipos en MySQL: BigInt(20) vs Int (20)
Me preguntaba cuál es la diferencia entre BigInt
, MediumInt
, y Int
son... parecería obvio que permitirían números más grandes; sin embargo, puedo hacer un Int(20)
o un BigInt(20)
y eso haría parecer que no se trata necesariamente de tamaño.
Alguna idea sería impresionante, solo un poco curiosa. He estado usando MySQL durante un tiempo y tratando de aplicar las necesidades de negocio al elegir tipos, pero nunca entendí este aspecto.
6 answers
Véase http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
INT
es un entero con signo de cuatro bytes.BIGINT
es un entero con signo de ocho bytes.
Cada uno de ellos acepta no más ni menos valores que los que se pueden almacenar en su respectivo número de bytes. Eso significa 232 valores en un INT
y 264 valores en a BIGINT
.
El 20 en INT(20)
y BIGINT(20)
significa casi nada. Es una sugerencia para el ancho de la pantalla. No tiene nada que ver con el almacenamiento, ni con el rango de valores que la columna aceptará.
Prácticamente, solo afecta a la opción ZEROFILL
:
CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;
+----------------------+
| bar |
+----------------------+
| 00000000000000001234 |
+----------------------+
Es una fuente común de confusión para los usuarios de MySQL ver INT(20)
y asumir que es un límite de tamaño, algo análogo a CHAR(20)
. Este no es el caso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-23 17:27:14
El número entre paréntesis en una declaración de tipo es display width, que no está relacionado con el rango de valores que se pueden almacenar en un tipo de datos. El hecho de que pueda declarar Int(20)
no significa que pueda almacenar valores de hasta 10^20 en él:
[...] Este ancho de visualización opcional puede ser utilizado por aplicaciones para mostrar valores enteros que tienen un ancho menor que el ancho especificado para la columna por la izquierda-rellenándolos con espacios. ...
El ancho de la pantalla hace no restringe el rango de valores que se pueden almacenar en la columna, ni el número de dígitos que se muestran para los valores que tienen un ancho superior al especificado para la columna. Por ejemplo, una columna especificada como SMALLINT(3) tiene el rango habitual de SMALLINT de -32768 a 32767, y los valores fuera del rango permitido por tres caracteres se muestran usando más de tres caracteres.
Para obtener una lista de los valores máximos y mínimos que se pueden almacenar en cada tipo de datos MySQL, consulte aquí.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-28 20:19:56
Cita :
La especificación "BIGINT(20)" no es un límite de dígitos. Solo significa que cuando se muestran los datos, si usa menos de 20 dígitos, se rellenará a la izquierda con ceros. 2^64 es el límite duro para el tipo BIGINT, y tiene 20 dígitos en sí, por lo tanto BIGINT(20) solo significa que todo menos de 10^20 será rellenado con espacios en pantalla.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-28 20:22:30
Por lo que sé, solo hay una pequeña diferencia es cuando está tratando de insertar un valor que está fuera de rango.
En los ejemplos usaré
401421228216
, que es101110101110110100100011101100010111000
(longitud 39 caracteres)
- Si tiene
INT(20)
para el sistema esto significa asignar en memoria un mínimo de 20 bits. Pero si va a insertar un valor que sea mayor que2^20
, se almacenará correctamente, solo si es menor queINT(32) -> 2147483647
(o2 * INT(32) -> 4294967295
paraUNSIGNED
)
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 tiene
BIGINT(20)
para el sistema esto significa asignar en memoria un mínimo de 20 bits. Pero si va a insertar un valor que sea mayor que2^20
, se almacenará correctamente, si es menor queBIGINT(64) -> 9223372036854775807
(o2 * BIGINT(64) -> 18446744073709551615
paraUNSIGNED
)
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 14:14:17
Quería añadir un punto más es, si usted está almacenando un número realmente grande como 902054990011312 entonces uno puede ver fácilmente la diferencia de INT(20)
y BIGINT(20)
. Se recomienda conservar en BIGINT
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-09 12:01:34
Vamos a dar un ejemplo para int(10) uno con palabra clave zerofill, uno no, a la tabla le gusta eso:
create table tb_test_int_type(
int_10 int(10),
int_10_with_zf int(10) zerofill,
unit int unsigned
);
Vamos a insertar algunos datos:
insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647)
;
Entonces
select * from tb_test_int_type;
# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'
Podemos ver que
Con la palabra
zerofill
, num menos de 10 llenará 0, pero sinzerofill
noEn segundo lugar con keyword
zerofill
, int_10_with_zf se convierte en unsigned int type, si inserta un menos obtendrá errorOut of range value for column.....
. Pero puedes insertar menos a int_10. También si inserte 4294967291 a int_10 obtendrá un errorOut of range value for column.....
Conclusión:
Int (X) sin palabra clave
zerofill
, es igual a rango int -2147483648~2147483647-
Int (X) con la palabra clave
zerofill
, el campo es igual al rango int sin signo 0~4294967295, si la longitud de num es menor que X, llenará 0 a la izquierda
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-13 07:28:51