Ich habe mich gefragt, was der Unterschied zwischen BigInt
, MediumInt
und Int
ist ... es scheint offensichtlich, dass sie größere Zahlen zulassen würden; ich kann jedoch eine Int(20)
oder eine BigInt(20)
machen, und das würde den Anschein erwecken, dass es nicht unbedingt um Größe geht.
Ein Einblick wäre fantastisch, nur ein bisschen neugierig. Ich benutze MySQL seit einiger Zeit und versuche, die geschäftlichen Anforderungen bei der Auswahl der Typen zu berücksichtigen, habe diesen Aspekt jedoch nie verstanden.
Siehe http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html
INT
ist eine 4-Byte-Ganzzahl mit Vorzeichen.
BIGINT
ist eine 8-Byte-Ganzzahl mit Vorzeichen.
Sie akzeptieren jeweils nicht mehr und nicht weniger Werte, als in ihrer jeweiligen Anzahl von Bytes gespeichert werden können. Das heißt 232 Werte in einem INT
und 264 Werte in einem BIGINT
.
Die 20 in INT(20)
und BIGINT(20)
bedeuten fast nichts. Dies ist ein Hinweis auf die Anzeigebreite. Dies hat nichts mit der Speicherung oder dem Wertebereich zu tun, den die Spalte akzeptiert.
In der Praxis betrifft dies nur die Option ZEROFILL
:
CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;
+----------------------+
| bar |
+----------------------+
| 00000000000000001234 |
+----------------------+
Es ist eine häufige Verwirrung für MySQL-Benutzer, INT(20)
zu sehen und anzunehmen, dass es sich um eine Größenbeschränkung handelt, ähnlich wie CHAR(20)
. Das ist nicht der Fall.
Die Zahl in Klammern in einer Typdeklaration ist Anzeigebreite, was nicht mit dem Wertebereich zusammenhängt, der in einem Datentyp gespeichert werden kann. Nur weil Sie Int(20)
deklarieren können, heißt das nicht, dass Sie Werte bis zu 10 ^ 20 darin speichern können:
[...] Diese optionale Anzeigebreite kann von Anwendungen verwendet werden, um ganzzahlige Werte anzuzeigen, deren Breite unter der für die Spalte angegebenen Breite liegt, indem sie mit Leerzeichen nach links aufgefüllt werden. ...
Die Anzeigebreite beschränkt weder den Wertebereich, der in der Spalte gespeichert werden kann, noch die Anzahl der Stellen, die für Werte angezeigt werden, deren Breite die für die Spalte angegebene Breite überschreitet. Beispielsweise hat eine als SMALLINT (3) angegebene Spalte den üblichen SMALLINT-Bereich von -32768 bis 32767, und Werte außerhalb des Bereichs von drei Zeichen werden mit mehr als drei Zeichen angezeigt.
Eine Liste der Maximal- und Minimalwerte, die in jedem MySQL-Datentyp gespeichert werden können, finden Sie unter hier.
Zitat :
Die Angabe "BIGINT (20)" ist keine Ziffernbeschränkung. Dies bedeutet lediglich, dass die Daten bei der Anzeige mit weniger als 20 Ziffern mit Nullen aufgefüllt bleiben. 2 ^ 64 ist die harte Grenze für den BIGINT-Typ und hat selbst 20 Stellen, daher bedeutet BIGINT (20) nur, dass alle weniger als 10 ^ 20 mit Leerzeichen auf dem Display aufgefüllt werden.
Soweit ich weiß, gibt es nur einen kleinen Unterschied, wenn Sie versuchen, einen Wert einzugeben, der außerhalb des zulässigen Bereichs liegt.
In Beispielen verwende ich
401421228216
, was101110101110110100100011101100010111000
ist (Länge 9 Zeichen)
INT(20)
für das System haben, bedeutet dies, dass mindestens 20 Bits im Speicher reserviert sind. Wenn Sie jedoch einen Wert eingeben, der größer als 2^20
ist, wird er nur dann erfolgreich gespeichert, wenn er kleiner als INT(32) -> 2147483647
(oder 2 * INT(32) -> 4294967295
für UNSIGNED
ist. )Beispiel:
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)
BIGINT(20)
für das System haben, bedeutet dies, dass mindestens 20 Bits im Speicher reserviert sind. Wenn Sie jedoch einen Wert eingeben, der größer als 2^20
ist, wird er erfolgreich gespeichert, wenn er kleiner als BIGINT(64) -> 9223372036854775807
(oder 2 * BIGINT(64) -> 18446744073709551615
für UNSIGNED
) ist.Beispiel:
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)
Ich wollte noch einen Punkt hinzufügen: Wenn Sie eine wirklich große Zahl wie 902054990011312 speichern, können Sie leicht den Unterschied zwischen INT(20)
und BIGINT(20)
erkennen. Es ist ratsam, in BIGINT
zu speichern.
Geben wir ein Beispiel für int (10) one mit dem Schlüsselwort zerofill an, eines nicht. Die Tabelle sieht so aus:
create table tb_test_int_type(
int_10 int(10),
int_10_with_zf int(10) zerofill,
unit int unsigned
);
Lassen Sie uns einige Daten einfügen:
insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647)
;
Dann
select * from tb_test_int_type;
# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'
Wir können das sehen
mit dem Schlüsselwort zerofill
wird num kleiner als 10 0 füllen, aber ohne zerofill
nicht
Zweitens wird mit dem Schlüsselwort zerofill
int_10_with_zf ein vorzeichenloser Int-Typ. Wenn Sie ein Minus einfügen, wird der Fehler Out of range value for column.....
. Sie können jedoch ein Minuszeichen in int_10 einfügen. Auch wenn Sie 4294967291 bis int_10 einfügen, wird der Fehler Out of range value for column.....
Fazit:
int (X) ohne Schlüsselwort zerofill
entspricht dem int-Bereich -2147483648 ~ 2147483647
int (X) mit dem Schlüsselwort zerofill
entspricht das Feld dem vorzeichenlosen int-Bereich 0 ~ 4294967295. Wenn die Länge von num kleiner als X ist, wird 0 nach links gefüllt