Boolean vs tinyint (1) dla wartości boolowskich w MySQL

124

Jakiego typu kolumny najlepiej używać w bazie danych MySQL dla wartości logicznych? Ja używam, booleanale mój kolega używa tinyint(1).

Tomek
źródło
3
Wygląda na to, że MySQL w przejrzysty sposób traktuje booleanjako tinyint(1). Więc można użyć boolean, trueoraz falsei traktuje je jak MySQL tinyint(1), 1i 0.
ADTC
Innym przypadkiem jest char 1 z Y & N, który według niektórych powinien być szybszy.
Strefa

Odpowiedzi:

154

Te typy danych są synonimami.

Māris Kiseļovs
źródło
6
Nie powiedziałbym, że typy danych są synonimami - tinyint (1) to to samo co bool, ale tinyint i bool to nie to samo. Drobna uwaga, ale twoja odpowiedź zaskoczyła mnie, gdy po raz pierwszy ją przeczytałem
Kyle Chadha
2
To nie odpowiada na pytanie. Chociaż prawdą jest, że tinyint (1) jest funkcjonalnie identyczne z bool, OP zapytał, czego najlepiej użyć. Odpowiedź @dj_segfault działa poprawnie, wyjaśniając, dlaczego bool powinien być preferowany nad tinyint (1) podczas przechowywania wartości boolowskiej.
Kyle Morgan
88

Mam zamiar przyjąć inne podejście i zasugerować, że zrozumienie kodu przez innych programistów jest równie ważne, jak dla kompilatora / bazy danych. Używanie boolean może zrobić to samo, co użycie tinyint, jednak ma tę zaletę, że semantycznie przekazuje twoje zamiary i to jest coś warte.

Jeśli używasz tinyint, nie jest oczywiste, że jedyne wartości, które powinieneś zobaczyć, to 0 i 1. Wartość logiczna ZAWSZE to prawda lub fałsz.

dj_segfault
źródło
36

booleannie jest odrębnym typem danych w MySQL; to tylko synonim tinyint. Zobacz tę stronę w podręczniku MySQL .

Osobiście sugerowałbym użycie tinyint jako preferencji, ponieważ boolean nie robi tego, co myślisz, że robi z nazwy, więc tworzy potencjalnie wprowadzający w błąd kod. Ale na poziomie praktycznym to naprawdę nie ma znaczenia - obaj robią to samo, więc nie zyskujesz ani nie tracisz niczego, używając obu.

Spudley
źródło
8

use enum jest to najłatwiejsze i najszybsze rozwiązanie

Nie polecam enum ani tinyint (1), ponieważ bit (1) potrzebuje tylko 1 bitu do przechowywania wartości logicznej, podczas gdy tinyint (1) potrzebuje 8 bitów.

ref

TINYINT vs ENUM (0, 1) dla wartości logicznych w MySQL

Pramendra Gupta
źródło
Nie możemy użyć wyliczenia, ponieważ nasza baza danych również musi obsługiwać sqlite
tom
11
Jeśli używasz InnoDB, bit zajmuje tyle samo miejsca, co tinyint. Z wysokowydajnego MySQL (ludzie z percona) „InnoDB przechowuje [s] każdą [bitową] kolumnę jako najmniejszą liczbę całkowitą wystarczająco dużą, aby pomieścić bity, więc nie oszczędzasz miejsca”. Jedynym zyskiem jest przechowywanie wielu wartości logicznych w kolumnie BIT (więcej niż 1). Więc jeśli masz tylko jedno pole boolowskie, użycie tinyint jest tym samym, co bit w InnoDB i jest lepsze, ponieważ tinyint jest zwykle łatwiejsze w obsłudze.
billmalarky
Nie dotyczy MySQL: BIT(M) - approximately (M+7)/8 bytespatrz: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

Chociaż prawdą jest, że booli tinyint(1)funkcjonalnie identyczne, boolpowinno to być preferowaną opcją, ponieważ niesie semantyczne znaczenie tego, co próbujesz zrobić. Ponadto wiele ORMów zostanie przekonwertowanych boolna rodzimy typ boolowski twojego języka programowania.

Kyle Morgan
źródło
0

Moje doświadczenie podczas używania Dappera do łączenia się z MySQL jest takie, że ma to znaczenie . Zmieniłem bit niedopuszczający wartości null (1) na tinyint dopuszczający wartość null (1) przy użyciu następującego skryptu:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Potem Dapper zaczął rzucać Wyjątki. Próbowałem spojrzeć na różnicę przed i po scenariuszu. I zauważyłem, że bit (1) zmienił się w tinyint (1).

Następnie pobiegłem:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Co rozwiązało problem.

smerlung
źródło