Jaki jest rozmiar kolumny int (11) w mysql w bajtach?

488

Jaki jest rozmiar kolumny int(11)w mysql w bajtach?

A maksymalna wartość, którą można przechowywać w tych kolumnach?

Gauraw
źródło
1
Możliwy duplikat Jakiego rozmiaru SQL Int (N)?
cellepo
1
@cellepo jeden jest ogólny SQL, drugi jest specyficzny dla mysql (plus ten ma znacznie więcej widoków). Jeśli chcesz iść na polowanie na dupe i sprawić, żebym szybko zamknął je jednym głosem, odwiedź czat SOBotics i pinguj mnie. Ale ten, który należy zamknąć, musi zostać oznaczony mysqlprzed moim przybyciem. Thx
Drew
6
Cześć ludzie. Być może jest duplikowany, ale jest bardziej przyjazny dla wyszukiwania. Większość osób wyszukuje w ten sposób za pomocą int (11). i rozwiązuje pytania innych ludzi. możesz sprawdzić jego liczbę widoków w porównaniu z innym. a użytkownik znajdzie tutaj bardziej szczegółową odpowiedź.
Gaurav,

Odpowiedzi:

685

INTBędzie zawsze 4 bajty bez względu na to jaka długość jest określona.

  • TINYINT = 1 bajt (8 bitów)
  • SMALLINT = 2 bajty (16 bitów)
  • MEDIUMINT = 3 bajty (24 bity)
  • INT = 4 bajty (32 bity)
  • BIGINT = 8 bajtów (64 bity).

Długość określa tylko liczbę znaków, które należy wpisać podczas wybierania danych za pomocą klienta wiersza poleceń mysql. 12345 zapisany jako int(3)nadal będzie wyświetlać się jako 12345, ale jeśli był zapisany tak int(10), nadal wyświetlałby się jako 12345, ale miałbyś opcję wpisania pierwszych pięciu cyfr. Na przykład, jeśli dodasz ZEROFILL, wyświetli się jako 0000012345.

... a maksymalna wartość to 2147483647 (podpisany) lub 4294967295 (niepodpisany)

Matt MacLean
źródło
111
co to znaczy 11 w int (11) tutaj.
Gaurav
73
Kolumna INT (4), liczba całkowita 1 byłaby wyświetlana jako 0001 TYLKO, jeśli kolumna została również określona jako zero. W przeciwnym razie zostanie wyświetlony jako numer 1, bez dodatkowych cyfr. @Gaurav - nie mieszaj sposobu, w jaki mysql wyświetla dane i jak je przechowuje, to dwie różne rzeczy. To, co widzisz, nie jest tym, czym naprawdę może być.
Michael JV
13
@ Michael Wow, naprawdę interesujące. Więc jeśli utworzysz kolumnę INT (3) i zapiszesz wartość 5001, zapisze ona 5001, ale wyświetli tylko 1. Nie wiedziałem o tym.
andrewtweber
16
@andrewtweber: 5001wyświetli się tak, 5001jakby pole było zdefiniowane jako INT(3). Zobacz odpowiedź @priyabagus poniżej i tutaj .
go2null 22.04.16
10
Jeśli nie podasz długości pól liczb całkowitych, MySQL ustawi wartość domyślną (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20) Warto zauważyć, że te domyślne długości są wystarczające do wyświetlenia dowolnej liczby, która może być przechowywany w tym polu (np. maksymalna wartość smallint wynosi 2 ^ 16 = 65536, 5 cyfr) Jeśli nie masz bardzo dobrego powodu, aby zrobić inaczej, zaleciłbym pozostawienie domyślnych rozmiarów, aby uniknąć złych niespodzianek.
Thibault Witzig
167

INT ( x ) zrobi różnicę tylko pod względem wyświetlania , to znaczy, aby wyświetlać liczbę w cyfrach x , a nie ogranicza się do 11. Sparujesz ją za pomocą ZEROFILL, która wstawi zera, aż dopasuje się do twojej długości.

Tak więc, dla dowolnej liczby x wINT(x)

  • jeśli przechowywana wartość ma mniej cyfr niż x , ZEROFILLwstawi zera.

    INT (5) ZEROFILL z zapamiętaną wartością 32 pokaże 00032
    INT (5) z zapamiętaną wartością 32 pokaże 32
    INT z zapamiętaną wartością 32 pokaże 32

  • jeśli przechowywana wartość ma więcej cyfr niż x , zostanie pokazana bez zmian.

    INT (3) ZEROFILL z zapamiętaną wartością 250000 pokaże 250000
    INT (3) z zapamiętaną wartością 250000 pokaże 250000
    INT z zapamiętaną wartością 250000 pokaże 250000

Nie ma to wpływu na rzeczywistą wartość przechowywaną w bazie danych, rozmiar jest nadal taki sam, a wszelkie obliczenia będą zachowywać się normalnie.

Dotyczy to również BIGINT, MEDIUMINT, SMALLINT i TINYINT.

priyabagus
źródło
49
Więc długość absolutnie nic, chyba że użyjesz zerofill?
developerbmw
29
@developerbmw - poprawnie. Długość nie robi absolutnie nic, chyba że użyjesz ZEROFILL.
Rick James
ZEROFILL jest zasadniczo trybem kompatybilności z komputerami mainframe.
Henk Poley
114

Zgodnie z tym , int(11)zajmie 4 bajty miejsca, czyli 32 bity miejsca o 2^(31) = 2147483648maksymalnej wartości i -2147483648minimalnej wartości. Jeden bit jest na znak.

Santosh Linkha
źródło
1
Twój przykład ma 9 dziewiątek. Czy możesz potwierdzić, że twój przykład jest poprawny? Jeśli tak, to dlaczego mówi 10, gdy jest 9 dziewiątek? Czy to liczba cyfr plus jeden plus znak znaku?
Homer6,
5
Nie, maksymalna liczba to 4294967295, jeśli int bez znaku, tj. 2 ^ 32. Liczba w nawiasach nie wpływa na typ pamięci. Jeśli potrzebujesz więcej niż 2 ^ 32, musisz przejść do bigint.
Kieran Tully
7
A raczej (2 ^ 32) -1.
Kieran Tully
2
+ Kieran ma rację. Maksymalna liczba różni się od podanej w odpowiedzi. Zobacz tutaj
daviewales,
38

Jak powiedzieli inni, minimalne / maksymalne wartości, które kolumna może przechowywać, oraz ilość miejsca w bajtach jest określana tylko przez typ, a nie przez długość.

Wiele z tych odpowiedzi mówi, że (11)część wpływa tylko na szerokość wyświetlania, co nie jest do końca prawdą, ale głównie.

Definicja int(2)bez podanego zerowania będzie:

  • nadal akceptuje wartość 100
  • nadal wyświetla wartość 100kiedy wyjście (nie 0lub 00)
  • szerokość wyświetlacza będzie szerokość największego wyjście wartość wynosi od select zapytania.

Jedyne, co (2)zrobi, to jeśli podany zostanie również zerofill :

  • Wartość 1zostaną przedstawione 01.
  • Podczas wyświetlania wartości kolumna zawsze będzie miała szerokość maksymalnej możliwej wartości, jaką może przyjąć kolumna, która wynosi 10 cyfr dla liczby całkowitej, zamiast minimalnej szerokości wymaganej do wyświetlenia największej wartości, którą kolumna musi pokazać w tym konkretnym zapytaniu wyboru , który może być znacznie mniejszy.
  • Kolumna nadal może przyjmować i wyświetlać wartość przekraczającą długość, ale te wartości nie będą poprzedzone zerami.

Najlepszym sposobem, aby zobaczyć wszystkie niuanse, jest uruchomienie:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

który wyświetli:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Ta odpowiedź jest testowana pod kątem MySQL 5.7.12 dla Linuksa i może, ale nie musi różnić się w przypadku innych implementacji.

Programista
źródło
5
„Zauważ, że kolumna int1 ma znacznie mniejszą szerokość wyświetlania niż zerofill2, nawet jeśli długość jest większa” ... Ehm, po prostu dlatego, że nazwa kolumny „zerofill2” ma długość 9 znaków w porównaniu do „int1” równej 4.
neokio
2
... tak, więc wyraźnie długość nie ma wpływu, nawet na szerokość wyświetlacza, gdy zerowanie nie jest włączone. W przeciwnym razie int1 byłby znacznie szerszy i miałby szerokość 10 znaków.
Programster
2
Dobre wyjaśnienie z solidnym przykładem. O wiele lepsza odpowiedź niż zaakceptowana. Dziękuję @Programster.
Corin
Minor nit: Jak wskazuje neokio, z tego zapytania nie można zaobserwować dokładnych konsekwencji „int (3)” przy zerowym wypełnieniu. Skróć nazwę kolumny do „zf2”, aby zachowanie było wyraźniejsze. W szczególności, czy to prawda, czy fałsz [w danej wersji DB], że „(z zerowym wypełnieniem) Kolumna zawsze będzie miała szerokość maksymalnej możliwej wartości, jaką mogłaby przyjąć kolumna, czyli 10 cyfr dla liczby całkowitej”
ToolmakerSteve
1
Aby wyjaśnić komentarz neokio i mój niewielki komentarz nit: Zdanie „Zauważ, że kolumna int1 ma znacznie mniejszą szerokość wyświetlania niż zerofill2, nawet jeśli długość jest większa”. powinien zostać usunięty z odpowiedzi. Jest to konsekwencja liczby znaków w słowie „zerofill2” - nie ma to nic wspólnego z testowaniem szerokości wyświetlania. Lepiej nadać tej kolumnie krótszą nazwę, np. „Zf2”. Wtedy mielibyśmy tabelę, w której „int1, int2 i zf2 mają dokładnie tę samą szerokość, mimo że int2 i zf2 określają małą szerokość (3)”.
ToolmakerSteve
32

Jaki jest rozmiar kolumny int (11) w mysql w bajtach?

(11)- ten atrybut inttypu danych nie ma nic wspólnego z rozmiarem kolumny. Jest to tylko szerokość wyświetlania typu danych liczb całkowitych. Od 11.1.4.5. Atrybuty typu numerycznego :

MySQL obsługuje rozszerzenie opcjonalnego określania szerokości wyświetlania liczb całkowitych typów danych w nawiasach następujących po słowie kluczowym typu dla tego typu. Na przykład INT (4) określa INT o szerokości wyświetlania czterech cyfr.

ks1322
źródło
19

Dobre wyjaśnienie tego można znaleźć tutaj

Podsumowując: Liczba N w int (N) jest często mylona z maksymalnym dopuszczalnym rozmiarem kolumny, jak ma to miejsce w przypadku varchar (N).

Ale nie jest tak w przypadku typów danych Integer liczba N w nawiasach nie jest maksymalnym rozmiarem kolumny, ale po prostu parametrem informującym MySQL, jaką szerokość ma wyświetlać kolumna, gdy dane tabeli są przeglądane przez MySQL konsola (gdy używasz atrybutu ZEROFILL).

Liczba w nawiasach powie MySQL, ile zer ma uzupełniać przychodzące liczby całkowite. Na przykład: Jeśli używasz ZEROFILL w kolumnie, która jest ustawiona na INT (5) i wstawiona jest liczba 78, MySQL wstawi tę wartość zerami, dopóki liczba nie wypełni liczby w nawiasach. tzn. 78 zmieni się na 00078, a 127 na 00127. Podsumowując: Liczba w nawiasach służy do wyświetlania.
W pewnym sensie liczba w nawiasach jest bezużyteczna, chyba że używasz atrybutu ZEROFILL.

Tak więc rozmiar int pozostałby taki sam, tj. -2147483648 do 2147483648 dla podpisanych i 0 do 4294967295 dla niepodpisanych(~ 2,15 miliarda i 4,2 miliarda, co jest jednym z powodów, dla których programiści nie są świadomi historii stojącej za liczbą N w nawiasach, ponieważ prawie nie wpływa ona na bazę danych, chyba że zawiera ona ponad 2 miliardy wierszy) i pod względem bajtów będzie 4 bajty .

Aby uzyskać więcej informacji na temat rozmiaru / zakresu typów liczb całkowitych, patrz MySQL Manual

shashi009
źródło
Dlaczego liczba rzędów ma tutaj znaczenie?
Old Geezer
@OldGeezer - zgadzam się, „liczba wierszy” nie ma znaczenia dla większości kolumn. Dotyczy tylko kolumny z automatycznym zwiększaniem klucza podstawowego (id).
ToolmakerSteve
10

Chociaż ta odpowiedź jest mało prawdopodobna, myślę, że warto podać następujące wyjaśnienie:

  • (n) za liczbą całkowitą typu danych w MySQL określa szerokość wyświetlania
  • szerokość wyświetlania NIE ogranicza długości liczby zwracanej z zapytania
  • szerokość wyświetlania NIE OGRANICZA liczby zer wypełnionych dla kolumny wypełnionej zerami, tak aby całkowita liczba pasowała do szerokości wyświetlania (o ile rzeczywista liczba nie przekracza szerokości wyświetlania, w którym to przypadku liczba jest wyświetlana jako taka)
  • szerokość wyświetlania jest również przeznaczona jako przydatne narzędzie dla programistów, aby wiedzieć, do jakiej długości wartość powinna zostać uzupełniona

BIT SZCZEGÓŁOWY,
którego szerokość ma najwyraźniej na celu dostarczenie metadanych o tym, ile zer ma być wyświetlanych w postaci liczby wypełnionej zerami.
W rzeczywistości NIE ogranicza długości liczby zwracanej z zapytania, jeśli liczba ta przekracza określoną szerokość wyświetlania.
Aby dowiedzieć się, jaka długość / szerokość jest faktycznie dozwolona dla typu danych liczb całkowitych w MySQL, zobacz listę i link: ( typy: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
W związku z powyższym można oczekiwać, że szerokość wyświetlania nie będzie miała wpływu na wyniki standardowego zapytania, chyba że kolumny są określone jako kolumny ZEROFILL
LUB
w przypadku, gdy dane są pobierane do aplikacji i ta aplikacja zbiera szerokość wyświetlacza do użycia dla innego rodzaju wypełnienia.

Podstawowy numer referencyjny: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

MER
źródło
Dziękujemy za udzielenie prawidłowej odpowiedzi. Próbowałem z wiersza polecenia MySQL i nie mogłem zmusić go do usunięcia żadnych cyfr za pomocą małych n, więc ... tak, to byk. Robi wszystko z zerofill.
mpen
@mpen Cieszę się, że mogłem pomóc, było to związane z czymś, co próbowałem i pomyślałem, że mogę tu podać więcej szczegółów, które mogą być przydatne dla kogoś innego.
MER
9

W MySQL liczba całkowita int(11)ma rozmiar 4 bajtów, co odpowiada 32 bitom.

Podpisana wartość to: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Niepodpisane wartości to: 0 to 2^32-1 = 0 to 4294967295

Sachin Agrawal
źródło
0

zgodnie z tą książką :

MySQL pozwala określić „szerokość” dla typów całkowitych, takich jak INT (11). Nie ma to większego znaczenia dla większości aplikacji: nie ogranicza legalnego zakresu wartości, ale po prostu określa liczbę znaków, które interaktywne narzędzia MySQL zarezerwują do celów wyświetlania. Dla celów przechowywania i obliczeń INT (1) jest identyczny z INT (20).

Alireza Rahmani Khalili
źródło
-4

Myślę, że maksymalna wartość int (11) wynosi 4294967295

Samuel
źródło
2
Jest 2147483647, ponieważ ma znak.
d3bit
-9

4294967295 jest odpowiedzią, ponieważ int (11) pokazuje maksymalnie 11 cyfr IMO

Dudee
źródło