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.
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.
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.
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.
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.
Chociaż prawdą jest, że booli tinyint(1)są 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.
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:
ALTERTABLE 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).
boolean
jakotinyint(1)
. Więc można użyćboolean
,true
orazfalse
i traktuje je jak MySQLtinyint(1)
,1
i0
.Odpowiedzi:
Te typy danych są synonimami.
źródło
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.
źródło
boolean
nie jest odrębnym typem danych w MySQL; to tylko synonimtinyint
. 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.
źródło
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
źródło
BIT(M) - approximately (M+7)/8 bytes
patrz: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlChociaż prawdą jest, że
bool
itinyint(1)
są funkcjonalnie identyczne,bool
powinno to być preferowaną opcją, ponieważ niesie semantyczne znaczenie tego, co próbujesz zrobić. Ponadto wiele ORMów zostanie przekonwertowanychbool
na rodzimy typ boolowski twojego języka programowania.źródło
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:
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:
Co rozwiązało problem.
źródło