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)
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
'afecta solo a la opción ZEROFILL:' ahora mi curiosidad termina – Umair
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. –