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?
106
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.
Z przeglądu typów liczbowych ;
BIT [(M)]
TINYINT [(M)] [UNSIGNED] [ZEROFILL]
Dodatkowo rozważ to;
BOOL, BOOLEAN
źródło
boolean
zajmie to bajt, mimo że to naprawdę tylko trochę, więc BIT (1) jest lepszy po wersji 5.0.3?BOOL
/BOOLEAN
są aliasy dlaTINYINT(1)
zamiastBIT
. Jasne, wszystkie zajmują cały bajt, ale semantycznieBIT
byłoby znacznie bardziej odpowiednie.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).
źródło
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.
źródło
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
źródło
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
źródło