Jaka jest różnica między BIT i TINYINT w MySQL?


106

W jakich przypadkach użyłbyś których? Czy jest duża różnica? Które z nich są zwykle używane przez silniki trwałości do przechowywania wartości logicznych?

Odpowiedzi:


122

TINYINT to 8-bitowa wartość całkowita, pole BIT może przechowywać od 1 bitu, BIT (1) do 64 bitów, BIT (64). W przypadku wartości logicznych BIT (1) jest dość powszechny.


10
Jaka jest różnica między TINYINT a BIT (8)?
Pacerier,

16
TINYINT może być ze znakiem lub bez i odnosić się do liczb ujemnych. Bit po prostu przechowuje bity bez podpisywania danych, pozostajesz do samodzielnej interpretacji MSB.
definiuje

4
Aby uniknąć nieporozumień, należy dodać, że TINYINT i BIT (1) nie różnią się wymaganiami dotyczącymi przechowywania, a BOOL i BOOLEAN są synonimami TINYINT (1) Przegląd typów liczbowych .
Timo Strotmann,

59

Z przeglądu typów liczbowych ;

BIT [(M)]

Typ pola bitowego. M oznacza liczbę bitów przypadających na wartość, od 1 do 64. Wartością domyślną jest 1, jeśli pominięto M.

Ten typ danych został dodany w MySQL 5.0.3 dla MyISAM i rozszerzony w 5.0.5 na MEMORY, InnoDB, BDB i NDBCLUSTER. Przed 5.0.3 BIT jest synonimem TINYINT (1).

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

Bardzo mała liczba całkowita. Zakres ze znakiem to od -128 do 127. Zakres bez znaku to od 0 do 255.

Dodatkowo rozważ to;

BOOL, BOOLEAN

Te typy są synonimami TINYINT (1). Wartość zero jest uważana za fałszywą. Wartości niezerowe są uważane za prawdziwe.


12
Mówisz, że booleanzajmie to bajt, mimo że to naprawdę tylko trochę, więc BIT (1) jest lepszy po wersji 5.0.3?
Pacerier,

3
Tak @Pacerier. Boolean to po prostu brzydki alias dla pola liczbowego.
Áxel Costas Pena

7
Jeśli chodzi o rzeczywistą pamięć, BIT (1) nadal zajmuje minimum jeden bajt. BIT (M) = (M + 7) / 8 bajtów. (1 + 7) / 8 = 1 bajt. Zobacz Wymagania dotyczące przechowywania typów liczbowych .
Drazen Bjelovuk

1
Smutne, że BOOL/ BOOLEANsą aliasy dla TINYINT(1)zamiast BIT. Jasne, wszystkie zajmują cały bajt, ale semantycznie BITbyłoby znacznie bardziej odpowiednie.
MestreLion

38

Wszystkie te teoretyczne dyskusje są świetne, ale w rzeczywistości, przynajmniej jeśli używasz MySQL i naprawdę również dla SQLServer, najlepiej trzymać się danych niebinarnych dla swoich wartości logicznych z tego prostego powodu, że łatwiej jest z nimi pracować, gdy wyprowadzanie danych, wysyłanie zapytań i tak dalej. Jest to szczególnie ważne, jeśli próbujesz osiągnąć interoperacyjność między MySQL i SQLServer (tj. Synchronizujesz dane między nimi), ponieważ obsługa typu danych BIT jest różna w obu z nich. WIĘC w praktyce będziesz miał dużo mniej kłopotów, jeśli będziesz trzymać się numerycznego typu danych. Poleciłbym MySQL trzymać się z BOOL lub BOOLEAN, który jest przechowywany jako TINYINT (1). Nawet sposób, w jaki MySQL Workbench i MySQL Administrator wyświetlają typ danych BIT, nie jest przyjemny (to mały symbol danych binarnych).


1
Moim zdaniem to nie moja wina, że ​​niektóre interfejsy itp. Nieprawidłowo interpretują poprawne dane binarne. Jeśli administrator (w tym ja) skarży się na jakiś symbol (odnosząc się do MySQL Wrokbench), to jest to wina tego, kto błędnie zinterpretował moje prawidłowe (binarne) dane jako symbol, który nie daje informacji o treści. Więc MySQL / Oracle popełniły błąd i nie chcę zmieniać mojej koncepcji programowania tylko dlatego, że ktoś się pomylił.
Matmarbon

11

BIT powinien zezwalać tylko na 0 i 1 (i NULL, jeśli pole nie jest zdefiniowane jako NIE NULL). TINYINT (1) pozwala na dowolną wartość, która może być przechowywana w jednym bajcie, -128..127 lub 0..255 w zależności od tego, czy jest bez znaku (cyfra 1 wskazuje, że zamierzasz użyć tylko jednej cyfry, ale tak nie przeszkadza w przechowywaniu większej wartości).

W przypadku wersji starszych niż 5.0.3 BIT jest interpretowany jako TINYINT (1), więc jest ma różnicy.

BIT ma semantykę „to jest boolowska”, a niektóre aplikacje będą traktować TINYINT (1) w ten sam sposób (ze względu na sposób, w jaki MySQL je traktował), więc aplikacje mogą sformatować kolumnę jako pole wyboru, jeśli sprawdzą typ i na tej podstawie zdecyduj o formacie.


4

Może się mylić, ale:

Tinyint to liczba całkowita od 0 do 255

bit ma wartość 1 lub 0

Dlatego dla mnie bit jest wyborem dla wartości logicznych


Przepraszam, że jesteśmy na T_SQL tutaj tak więc dont wiem
Allen Hardy

0

Z mojego doświadczenia mówię ci, że BIT ma problemy z typami systemów operacyjnych Linux (np. Ubuntu). Opracowałem swoją bazę danych w systemie Windows i po wdrożeniu wszystkiego w systemie Linux miałem problemy z zapytaniami, które wstawiały lub wybierały z tabel, które miały BITOWY TYP DANYCH.

Bit nie jest na razie bezpieczny. Zmieniłem na tinyint (1) i działałem idealnie. Chodzi mi o to, że potrzebujesz tylko wartości do rozróżnienia, czy jest 1 lub 0 i tinyint (1) jest w porządku

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.