Per quanto ne so, c'è solo una piccola differenza quando si cerca di inserire un valore fuori dalla portata.
Negli esempi userò 401421228216
, che è 101110101110110100100011101100010111000
(lunghezza caratteri)
- Se si dispone
INT(20)
per sistema significa allocare nella memoria minima 20 bit. Ma se si inserisce il valore che più grande di 2^20
, verrà memorizzato con successo, solo se si tratta di meno di INT(32) -> 2147483647
(o 2 * INT(32) -> 4294967295
per UNSIGNED
)
Esempio:
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)
- Se hai
BIGINT(20)
per sistema questo significa allocare in memoria minimo 20 bit. Ma se si inserisce il valore che più grande di 2^20
, esso verrà memorizzato con successo, se si tratta di meno di BIGINT(64) -> 9223372036854775807
(o 2 * BIGINT(64) -> 18446744073709551615
per UNSIGNED
)
Esempio:
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)
fonte
2017-10-12 14:14:17
Wow, questo post ha chiarito perfettamente la mia confusione su questo argomento. Sembra una scelta strana da parte degli sviluppatori - come avrei immaginato fosse larghezza + valore massimo, o bit/ecc. – Sh4d0wsPlyr
'interessa solo l'opzione ZEROFILL:' ora la mia curiosità termina – Umair
Mi piacerebbe davvero che avessero progettato la sintassi con il display con ZEROFILL invece di INT. Esempio: 'bar INT ZEROFILL (20)'. Sarebbe stato molto più chiaro. Ma quella decisione è stata presa molto tempo fa, e cambiandola ora si rompono milioni di installazioni di database. –