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

Ich habe mich gefragt, was der Unterschied zwischen BigInt , MediumInt und Int ist … es würde offensichtlich scheinen, dass sie größere Zahlen zulassen würden; Allerdings kann ich einen Int(20) oder einen BigInt(20) und das würde scheinen, dass es nicht unbedingt um Größe geht.

Eine Einsicht wäre toll, nur irgendwie neugierig. Ich benutze MySQL schon eine Weile und versuche, geschäftliche Bedürfnisse bei der Auswahl von Typen zu berücksichtigen, aber ich habe diesen Aspekt nie verstanden.

   

Siehe http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html

  • INT ist eine vier Byte umfassende Ganzzahl mit Vorzeichen.

  • BIGINT ist eine Acht-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 bedeutet 2 32 Werte in einem INT und 2 64 Werte in einem BIGINT .

Die 20 in INT(20) und BIGINT(20) bedeutet fast nichts. Es ist ein Hinweis für die Anzeigebreite. Es hat nichts mit Speicher zu tun, noch mit dem Wertebereich, den diese Spalte akzeptiert.

Praktisch betrifft dies nur die ZEROFILL Option:

 CREATE TABLE foo ( bar INT(20) ZEROFILL ); INSERT INTO foo (bar) VALUES (1234); SELECT bar from foo; +----------------------+ | bar | +----------------------+ | 00000000000000001234 | +----------------------+ 

Es ist eine häufige Quelle der Verwirrung für MySQL-Benutzer, INT(20) und anzunehmen, dass es eine Größenbeschränkung ist, etwas, das zu CHAR(20) analog ist. Das ist nicht der Fall.

Die Zahl in Klammern in einer Typdeklaration ist Anzeigebreite , die nichts mit dem Wertebereich zu tun hat, der in einem Datentyp gespeichert werden kann. Nur weil Sie Int(20) deklarieren können, bedeutet 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 kleiner als die für die Spalte angegebene Breite ist, indem sie mit Leerzeichen linksaufgefüllt werden. …

Die Anzeigebreite beschränkt nicht den Bereich der Werte, die in der Spalte gespeichert werden können, noch die Anzahl der Ziffern, 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, der durch drei Zeichen zulässig ist, werden mit mehr als drei Zeichen angezeigt.

Eine Liste der maximalen und minimalen Werte, die in jedem MySQL-Datentyp gespeichert werden können, finden Sie hier .

Quote :

Die Spezifikation “BIGINT (20)” ist keine Ziffernbegrenzung. Es bedeutet nur, dass wenn die Daten angezeigt werden, wenn es weniger als 20 Ziffern verwendet, wird es links aufgefüllt mit Nullen. 2 ^ 64 ist die harte Grenze für den BIGINT-Typ und hat selbst 20 Ziffern, daher bedeutet BIGINT (20), dass alles, was weniger als 10 ^ 20 ist, links mit Leerzeichen auf dem Display aufgefüllt wird.

Soweit ich weiß, gibt es nur einen kleinen Unterschied, wenn Sie versuchen, einen Wert einzufügen, der außerhalb des zulässigen Bereichs liegt.

In Beispielen verwende ich 401421228216 , das ist 101110101110110100100011101100010111000 (Länge 39 Zeichen)

  • Wenn Sie INT(20) für System haben, bedeutet dies, daß mindestens 20 Bits im Speicher reserviert werden. Aber wenn Sie einen Wert einfügen, der größer als 2^20 , wird er erfolgreich gespeichert, nur wenn er kleiner ist als INT(32) -> 2147483647 (oder 2 * INT(32) -> 4294967295 für UNSIGNED )

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 System haben, bedeutet dies mindestens 20 Bits im Speicher reservieren. Aber wenn Sie einen Wert einfügen, der größer als 2^20 , wird er erfolgreich gespeichert, wenn er kleiner ist als BIGINT(64) -> 9223372036854775807 (oder 2 * BIGINT(64) -> 18446744073709551615 für UNSIGNED )

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 einen weiteren Punkt hinzufügen ist, wenn Sie eine wirklich große Zahl wie 902054990011312 speichern, dann kann man leicht den Unterschied von INT(20) und BIGINT(20) . Es ist ratsam, in BIGINT zu speichern.

Lassen Sie uns ein Beispiel für int (10) eins mit Null-Schlüsselwort geben, eins nicht, die Tabelle mag das:

 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 weniger als 10 0 füllen, aber ohne zerofill es nicht

  • Zweitens wird zerofill mit dem Schlüsselwort zerofill vorzeichenloser int-Typ, wenn Sie ein Minuszeichen einfügen, erhalten Sie den Fehler Out of range value for column..... Aber Sie können minus in int_10 einfügen. Wenn Sie 4294967291 in int_10 einfügen, erhalten Sie den Fehler Out of range value for column.....

Fazit:

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

  2. int (X) mit dem Schlüsselwort zerofill , das Feld ist gleich dem vorzeichenlosen int-Bereich 0 ~ 4294967295, wenn die Länge von num weniger als X ist, füllt es 0 nach links