Zamieszanie BOOLEAN lub TINYINT

93

Projektowałem bazę danych dla witryny, w której muszę użyć logicznego typu danych, aby przechowywać tylko 2 stany, prawda lub fałsz. Używam MySQL.
Projektując bazę danych przy użyciu phpMyAdmin, stwierdziłem, że mam zarówno typ danych BOOLEAN, jak i typ danych TINYINT.
Przejrzałem różne artykuły, niektórzy mówili, że TINYINT to to samo co BOOLEAN, bez różnicy. Niektórzy twierdzą, że BOOLEAN jest konwertowany na TINYINT w MySQL.

MOJE pytanie brzmi, jeśli oba są takie same, dlaczego istnieją dwa? Powinien być tylko jeden z nich.

Oto odniesienie do artykułów, które czytałem:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Bipin Chandra Tripathi
źródło

Odpowiedzi:

137

MySQL nie ma wewnętrznego typu danych logicznych. Wykorzystuje najmniejszy całkowity typ danych - TINYINT.

BOOLEAN i BOOL są odpowiednikami TINYINT (1), ponieważ są synonimami.

Spróbuj utworzyć tę tabelę -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Następnie uruchom SHOW CREATE TABLE, otrzymasz to wyjście -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
Devart
źródło
1
Ale twoja odpowiedź jest poprawna we wszystkich innych aspektach. To, co wydaje się być mylące w PO, to istnienie synonimów.
ypercubeᵀᴹ
2
Wygląda na to, że jest to zrobione w celu zapewnienia kompatybilności wstecznej. Typ danych BOOLEAN był przed MySQL 5 i nie był zoptymalizowany typ BIT, był to również TINYINT. Z dokumentacji - Nowe funkcje planowane w wersji 5.1: Zoptymalizuj typ BIT, aby zająć jeden bit. (BIT zajmuje teraz jeden bajt; jest traktowany jako synonim TINYINT.).
Devart
5
Tak, można wiedzieć, mieć BIT(1)lub BIT(17)nawetBIT(64)
ypercubeᵀᴹ
3
@Devart - Tam, gdzie Twoja odpowiedź ma najwięcej głosów i pojawia się jako pierwsza (w każdym razie na mojej liście), a jakiś czas już minęło, czy jest jakaś szansa, że ​​zechcesz dodać do swojej odpowiedzi dyskusję na temat typu BIT w MySQL 5.1 i później?
Jonathan,
3
@Jonathan Być może wspomnienie o tym jest cenne, jednak BIT (1) w rzeczywistości nie zajmuje mniej miejsca niż TINYINT (1) i nie wyświetla się tak, jak by się spodziewała większość ludzi, używając standardowej konsoli mysql. Z powodu tej wady i braku korzyści związanych z przechowywaniem, samo użycie TINYINT (1) lub BOOLEAN wydaje się być najczęstszym z moich doświadczeń.
Tyler Smith
31

Tylko uwaga dla programistów php (brakuje mi wymaganych punktów stosu, aby opublikować to jako komentarz) ... automagiczna (i cicha) konwersja do TINYINT oznacza, że ​​php pobiera wartość z kolumny „BOOLEAN” jako „0” lub „1”, a nie oczekiwana (przeze mnie) prawda / fałsz.

Deweloper, który patrzy na SQL używany do tworzenia tabeli i widzi coś w rodzaju: „some_boolean BOOLEAN NOT NULL DEFAULT FALSE”, może rozsądnie spodziewać się wyników prawda / fałsz po pobraniu wiersza zawierającego tę kolumnę. Zamiast tego (przynajmniej w mojej wersji PHP) wynikiem będzie „0” lub „1” (tak, ciąg „0” lub „1”, a nie int 0/1, dziękuję php).

To głupota, ale wystarczająca, aby testy jednostkowe zakończyły się niepowodzeniem.

Tom Stambaugh
źródło
2
Jako dodatkowa uwaga, sterowniki mysql PHP pobierają wszystkie typy liczb całkowitych jako ciągi.
kojow7
24

Najnowsze wersje MySQL mają nowy BITtyp danych, w którym możesz określić liczbę bitów w polu, na przykład BIT(1)użyć jako Booleantyp, ponieważ może to być tylko 0lub 1.

Please_Dont_Bully_Me_SO_Lords
źródło
7

Począwszy od wersji MySQL 5.1 odniesieniem

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

==================================================== =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

fortuna
źródło
1
Twoje odniesienie mówi, że wymagana pamięć to w rzeczywistości „około (M + 7) / 8 bajtów”. tj. zaokrągla w górę do następnego pełnego bajtu. Tak więc nie zajmuje 1 bitu.
otwarte