webentwicklung-frage-antwort-db.com.de

Typen in MySQL: BigInt (20) vs Int (20)

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.

195
Parris

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.

415
Bill Karwin

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.

38
John Feminella

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.

13
OMG Ponies

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, was 101110101110110100100011101100010111000 ist (Länge 9 Zeichen)

  • Wenn Sie 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)
  • Wenn Sie 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)
2

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.

1
Debasis Sabat

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:

  1. int (X) ohne Schlüsselwort zerofill entspricht dem int-Bereich -2147483648 ~ 2147483647

  2. 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

0
Jayhello