@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)
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.
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.
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:
„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.
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
@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.
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
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).
mysql
przed moim przybyciem. ThxOdpowiedzi:
INT
Bę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 takint(10)
, nadal wyświetlałby się jako 12345, ale miałbyś opcję wpisania pierwszych pięciu cyfr. Na przykład, jeśli dodaszZEROFILL
, wyświetli się jako 0000012345.... a maksymalna wartość to 2147483647 (podpisany) lub 4294967295 (niepodpisany)
źródło
5001
wyświetli się tak,5001
jakby pole było zdefiniowane jakoINT(3)
. Zobacz odpowiedź @priyabagus poniżej i tutaj .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 w
INT(x)
jeśli przechowywana wartość ma mniej cyfr niż x ,
ZEROFILL
wstawi zera.jeśli przechowywana wartość ma więcej cyfr niż x , zostanie pokazana bez zmian.
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.
źródło
ZEROFILL
.Zgodnie z tym ,
int(11)
zajmie 4 bajty miejsca, czyli 32 bity miejsca o2^(31) = 2147483648
maksymalnej wartości i-2147483648
minimalnej wartości. Jeden bit jest na znak.źródło
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:100
100
kiedy wyjście (nie0
lub00
)Jedyne, co
(2)
zrobi, to jeśli podany zostanie również zerofill :1
zostaną przedstawione01
.Najlepszym sposobem, aby zobaczyć wszystkie niuanse, jest uruchomienie:
który wyświetli:
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.
źródło
(11)
- ten atrybutint
typu 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 :źródło
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
źródło
Chociaż ta odpowiedź jest mało prawdopodobna, myślę, że warto podać następujące wyjaśnienie:
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
źródło
n
, więc ... tak, to byk. Robi wszystko z zerofill.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
źródło
zgodnie z tą książką :
źródło
Myślę, że maksymalna wartość int (11) wynosi 4294967295
źródło
4294967295 jest odpowiedzią, ponieważ int (11) pokazuje maksymalnie 11 cyfr IMO
źródło