Odpowiedzi:
Te typy danych są synonimami.
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.
boolean
nie 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.
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
BIT(M) - approximately (M+7)/8 bytes
patrz: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Chociaż prawdą jest, że bool
i tinyint(1)
są funkcjonalnie identyczne, bool
powinno to być preferowaną opcją, ponieważ niesie semantyczne znaczenie tego, co próbujesz zrobić. Ponadto wiele ORMów zostanie przekonwertowanych bool
na 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:
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.
boolean
jakotinyint(1)
. Więc można użyćboolean
,true
orazfalse
i traktuje je jak MySQLtinyint(1)
,1
i0
.