Którego typu danych MySQL należy użyć do przechowywania wartości logicznych

1207

Ponieważ wydaje się, że MySQL nie ma żadnego typu danych „boolowskich”, jaki typ danych „nadużywasz” do przechowywania prawdziwych / fałszywych informacji w MySQL?

Zwłaszcza w kontekście pisania i czytania ze skryptu PHP.

Z czasem wykorzystałem i widziałem kilka podejść:

  • tinyint, pola varchar zawierające wartości 0/1,
  • pola varchar zawierające ciągi „0” / „1” lub „true” / „false”
  • i na koniec wylicza pola zawierające dwie opcje „prawda” / „fałsz”.

Żadne z powyższych nie wydaje się optymalne. Wolę wariant maleint 0/1, ponieważ automatyczna konwersja typów w PHP daje mi raczej wartości logiczne.

Jakiego typu danych używasz? Czy istnieje typ zaprojektowany dla wartości boolowskich, które przeoczyłem? Czy widzisz jakieś zalety / wady wynikające z używania takiego czy innego rodzaju?

Peter Mortensen
źródło
217
Każdy, kto czyta stare odpowiedzi na to pytanie, musi zrozumieć, że MySQL dodał nieco typ danych w wersji 5. Wykorzystaj te informacje, jak możesz. dev.mysql.com/doc/refman/5.0/en/bit-type.html
smp7d
7
dla bieżącej wersji typu MYSQL Boolean jest dostępny - dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html sprawdź to. zgodnie z tą wartością zero uważa się za fałsz
DevT
7
bit(1)jest trochę ** do zaimportowania do Excela. Przejście do tinyint(1)prac.
Cees Timmerman
8
teraz mamy boolean po 5 latach
V-SHY

Odpowiedzi:

1232

W przypadku MySQL 5.0.3 i nowszych można użyć BIT. Instrukcja mówi:

Począwszy od MySQL 5.0.3, typ danych BIT służy do przechowywania wartości pól bitowych. Rodzaj BIT (M) umożliwia przechowywanie wartości M-bitowych. M może wynosić od 1 do 64.

W przeciwnym razie, zgodnie z instrukcją MySQL, możesz użyć bool i boolean, które są w tej chwili aliasami tinyint (1):

Bool, Boolean: Te typy są synonimami TINYINT (1). Wartość zero jest uważana za fałsz. Wartości niezerowe są uważane za prawdziwe.

MySQL stwierdza również, że:

Zamierzamy wdrożyć pełną obsługę typu logicznego, zgodnie ze standardowym SQL, w przyszłej wersji MySQL.

Odnośniki: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

markus
źródło
11
Tak, wybrałbym to albo CHAR (1) i przechowywałem „Y” / „N” lub „T” / „F” itd. W zależności od kontekstu. Zaletą używania małej liczby całkowitej jest to, że można uzyskać maksymalną przenośność między RDBMS -ami
Roland Bouman
36
Posługiwanie się char, przynajmniej w PHP, doprowadzi do większej ilości kodu, !$booleanktóry nigdy nie oceni poprawnie bez dalszego przetwarzania.
Łagodny Fuzz
10
@ Pecerier Nic, czego nie mógłbyś znaleźć w Google, ale ok, ugryzę. Przede wszystkim spójrz na data0type.h. Pamiętaj, że innodb nie definiuje tam natywnie typu BIT. Gdyby traktował pola BIT w sposób opisany przez ciebie, z pewnością znaleźlibyśmy tam ślad jego istnienia. Po drugie, przeczytaj mysqlperformanceblog.com/2008/04/23/… . I nie wahaj się oświecić nas, którzy niesamowici klienci MySQL w „marktetplace” grają dobrze z polami BIT. Przydadzą się tym, którzy bez wątpienia przegapili ten artykuł.
Roland Bouman,
9
Kiedy dokonam wyboru, standardowe bity wiersza poleceń klienta mysql są całkowicie puste. Z tego powodu wolę TINYINT (1).
Użytkownik
8
@MikePurcell Nienawidzę pytać, ale dlaczego miałbyś chcieć auto_incrementw kolumnie reprezentującej wartość logiczną?
Chris Hayes,
248

BOOLi BOOLEANsą synonimami TINYINT(1). Zero jest false, wszystko inne jest true. Więcej informacji tutaj .

Philip Morton
źródło
7
Nie (1)robi nic więcej, jak określić sposób wyświetlania wartości, jeśli jesteś świadomy wielkości pamięci, to BITzamiast tego chcesz użyć
JamesHalsall
35
@JamesHalsall: Właściwie BIT(1)i TINYINT(1)oba wykorzystają jeden bajt pamięci. Aż do MySQL 5.0.3 BITbył właściwie synonimem TINYINT. Późniejsze wersje MySQL zmieniły implementację BIT. Ale nawet przy zmianie implementacji, nadal nie ma korzyści dla BITtypu danych „wielkości pamięci” (przynajmniej w przypadku InnoDB i MyISAM; inne silniki pamięci, np. NDB, mogą mieć pewną optymalizację pamięci dla wielu deklaracji kolumn BIT.) Większy problem polega na tym, że niektórzy klienci biblioteki nie rozpoznają ani nie obsługują zwracanych BITkolumn typu danych. TINYINTLepiej działa.
spencer7593
5
Podręcznik MySQL 5.0 wyraźnie stwierdza, że ​​wartość logiczna wynosi 1 lub 0. Wyrażenie „wszystko inne jest true” nie jest prawdziwe.
Walter
7
@Walter: W rzeczywistości jest to trochę prawda, wyjaśnienie jest nieco brakuje. W skrócie, w kontekście logicznym, wyrażenie może mieć wartość NULL, FALSE lub TRUE. W instrukcji MySQL wyrażenie oceniane w kontekście logicznym jest najpierw oceniane jako liczba całkowita (wartości dziesiętne i zmiennoprzecinkowe są zaokrąglane, ciągi znaków są konwertowane w zwykły dziwny sposób, w jaki MySQL konwertuje ciągi na liczby całkowite). NULL jest oczywiście NULL (ani PRAWDA, ani FAŁSZ). Wartość całkowita 0 jest traktowana jako FAŁSZ, a każda inna wartość całkowita (1, 2, -7 itd.) Ma wartość PRAWDA. W celu zachowania zgodności naśladujemy logikę / obsługę logiki TINYINT
spencer7593,
4
@ Walter: Łatwo to przetestować, np SELECT 'foo' AS bar FROM dual WHERE -7. Wyrażenie -7 jest oceniane w kontekście logicznym, a zapytanie zwraca wiersz. Możemy przetestować za pomocą 0 lub dowolnego wyrażenia, którego wynikiem jest liczba całkowita 0, i żaden wiersz nie jest zwracany. Jeśli wyrażenie w klauzuli WHERE ma wartość inną niż zero, całkowitą wartość inną niż zero, wyrażenie ma wartość PRAWDA. (Uważam, że wartości dziesiętne i zmiennoprzecinkowe są „zaokrąglane” do liczb całkowitych, np. WHERE 1/3Ocenia na WHERE 0. Otrzymujemy ten sam wynik z WHERE 'foo', ponieważ łańcuch 'foo'również
zwraca
71

To eleganckie rozwiązanie, które doceniam, ponieważ wykorzystuje zero bajtów danych:

some_flag CHAR(0) DEFAULT NULL

Aby ustawić wartość true, ustaw some_flag = ''i ustaw wartość false, ustaw some_flag = NULL.

Następnie, aby sprawdzić, czy jest prawda, sprawdź, czy jakaś_flaga IS NOT NULL, i aby sprawdzić, czy jest jakaś_faga, sprawdź, czy jakaś_flaga IS NULL.

(Ta metoda została opisana w „High Performance MySQL: Optymalizacja, kopie zapasowe, replikacja i więcej” Jon Warren Lentz, Baron Schwartz i Arjen Lentz.)

RS
źródło
3
fantazyjna sztuczka! jest to pomocne, jeśli pracujesz z MySQL <5, a być może nawet lżejszym niż BIT, ale w celu zachowania zgodności z konwencją i nieco mniejszym obciążeniem obliczeniowym (logika vs dokładna wartość) powiedziałbym, że BIT jest lepszą drogą.
zamnuts,
59
Może być „szybki”, ale zaciemnia dane tak, że żaden nowy programista nie miałby pojęcia, co oznacza kolumna.
Richthofen,
5
To używa tej samej ilości bajtów co BIT (1)
ITS Alaska
25
Powodzenia w uzyskaniu ORM ładnie odwzorowanego na tym.
Craig Labenz
4
Zgadzam się z @Richthofen i trudno mi sobie wyobrazić sytuację, w której kiedykolwiek opowiadałbym się za użyciem tego rozwiązania. Jeśli jednak ma być użyty, wówczas podanie jako COMMENTdefinicji w kolumnie, która NULLwskazuje na fałsz i ''wskazuje na prawdę, może pójść w bardzo niewielkim stopniu w kierunku ułatwienia przyszłego zrozumienia.
eggyal
34

Jeśli używasz typu BOOLEAN, jest on aliasowany do TINYINT (1). Jest to najlepsze, jeśli chcesz używać standardowego SQL i nie przejmuj się, że pole może zawierać wartość spoza zakresu (w zasadzie wszystko, co nie jest równe 0, będzie „prawdziwe”).

ENUM („Fałsz”, „Prawda”) pozwoli ci używać ciągów w twoim SQL, a MySQL zapisze pole wewnętrznie jako liczbę całkowitą, gdzie „Fałsz” = 0 i „Prawda” = 1 w oparciu o kolejność określania Enum .

W MySQL 5+ możesz użyć pola BIT (1), aby wskazać 1-bitowy typ liczbowy. Nie sądzę, że faktycznie zajmuje to mniej miejsca w pamięci, ale znowu pozwala ograniczyć możliwe wartości do 1 lub 0.

Wszystkie powyższe zużyją mniej więcej tyle samo miejsca, więc najlepiej wybrać ten, który jest dla Ciebie najłatwiejszy do pracy.

Ciaran McNulty
źródło
8
Twoja uwaga dotycząca ENUM jest nieprawdziwa: spróbuj CAST (yourenumcol AS UNSIGNED), a zauważysz, że False będzie równa 1, a True będzie równa 2. Kolejnym problemem z ENUM jest to, że zbyt łatwo jest wstawić '' (pusty ciąg ). Odradzałbym używanie tego.
Roland Bouman
4
Z mojego doświadczenia wynika, że ​​używanie pola BIT (1) z kodu PHP było trochę kłopotliwe. TINYINT (1) był znacznie łatwiejszy i stworzył bardziej czytelny kod.
M-Peror,
1
@ M-Peror - „użycie pola BIT (1) z kodu PHP było trochę kłopotliwe” ... nie było zamierzonej gry słów. :) Ale tak, zgadzam się. Pamiętam też, że TINYINT (1) był łatwiejszy ... po prostu nie pamiętam dlaczego. Czy ktoś jeszcze o tym myśli? BIT (1) wydaje się ładniejszy na powierzchni, ponieważ można ograniczyć do 0 lub 1. Myślę, że BIT był czasami interpretowany jako dane binarne (w zależności od języka programowania i sterownika / biblioteki); podczas gdy TINYINT traktowano bardziej jak liczbę.
BMiner,
2
@BMiner - haha, to było naprawdę niezamierzone, nie zauważyłem tego :) Ale rzeczywiście, jeśli dobrze pamiętam, pole bitowe zostało zinterpretowane jako coś binarnego, podczas gdy malutki łatwiej było traktować jako liczbę, a przez to łatwiej użyj w wyrażeniu (boolowskim).
M-Peror,
34

Odpowiedzi na to pytanie, ale pomyślałem, że wrzucę moje 0,02 $. Często używam CHAR(0), gdzie '' == true and NULL == false.

Z mysql docs :

CHAR(0)jest również całkiem przyjemny, gdy potrzebujesz kolumny, która może przyjmować tylko dwie wartości: Kolumna zdefiniowana jako CHAR(0) NULLzajmuje tylko jeden bit i może przyjmować tylko wartości NULLi ''(pusty ciąg).

Josh
źródło
16
mm, wygląda na to, że prosisz o kłopoty, jeśli jesteś mną. Mam na myśli, że w zależności od języka może być zbyt łatwo nie zauważyć różnicy między NULL a '' (na przykład PHP).
Roland Bouman
3
Pod względem oszczędności miejsca (liczba bajtów użytych do przedstawienia wartości logicznej), to podejście jest wyraźnym zwycięzcą. To oszczędza bajt nad TINYINT. Minusem (jak wskazują niektóre komentarze) jest to, że niektórzy klienci mogą mieć trudności z rozróżnieniem NULL i pustego łańcucha. Nawet niektóre relacyjne bazy danych (np. Oracle) nie rozróżniają ciągów o zerowej długości od NULL.
spencer7593
3
To bardzo sprytne! Kiedyś pisałem sprytny kod, teraz unikam go jak zarazy. Chcę teraz, aby mój kod miał krystalicznie czyste intencje, a nie tylko prawidłowe zachowanie. Moja rada? Zrób to tylko, jeśli chcesz pomylić każdego, kto musi obsługiwać kod / bazę danych. Na przykład, zarówno w PHP ''i nullsą wartościami falsy.
CJ Dennis
1
@CJDennis Jeśli wyodrębniłeś warstwę bazy danych za wzorzec repozytorium, nie musisz się martwić o niejasność tego rozwiązania.
prograhammer
18

Używam TINYINT (1) do przechowywania wartości logicznych w Mysql.

Nie wiem, czy jest jakaś korzyść z korzystania z tego ... Ale jeśli się nie mylę, mysql może przechowywać wartości logiczne (BOOL) i przechowuje je jako tinyint (1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html

Fred
źródło
17

Bit ma przewagę nad różnymi opcjami bajtów (tinyint, enum, char (1)), jeśli masz dużo pól boolowskich. Jedno pole bitowe nadal zajmuje pełny bajt. Dwa pola bitowe pasują do tego samego bajtu. Trzy, cztery, pięć, sześć, siedem, osiem. Następnie zaczynają wypełniać następny bajt. Ostatecznie oszczędności są tak małe, że istnieją tysiące innych optymalizacji, na których powinieneś się skupić. O ile nie masz do czynienia z ogromną ilością danych, te kilka bajtów nie zsumuje się zbyt wiele. Jeśli używasz bitów z PHP, musisz typować rzut wartości wchodzących i wychodzących.

Thor
źródło
1
+1 za komentarz do rzutowania. Aby dodać do tego podczas pracy z językami programowania, unikaj stosowania leniwych technik programowania na rzecz spójności. Używaj identycznych operatorów zamiast po prostu równych. W przypadku PHP if ($ var == "") będzie prawdziwe dla 0, false, null, undefined i "". w celu przetestowania wszystkich wartości często najlepiej jest użyć if (true === empty ($ var)), ponieważ pozwoli to również uniknąć niezdefiniowanych błędów. Powinieneś również sprawdzić typ danych, z którymi pracujesz, jeśli (is_int ($ var) && $ var === 0) lub typecast, aby wymusić utworzenie określonego typu danych (int) $ var dla zadania.
fyrye
@Thor Czy dotyczy to MySQL w takim samym stopniu, jak w przypadku MSSQL? Migruję nową aplikację, która nie została jeszcze uruchomiona z MSSQL do MySQL. Nie używam PHP, ale raczej konwertuję C # na Javę 8. Biorąc pod uwagę, że Java jest silnie typowanym językiem, nie martwię się o obsługę typów ... tylko wszystkie flagi bitowe, które przesuwałyby się z jednego bajtu dla maksymalnie 8 flag na 1 bajt dla każdej flagi podanej TINYINT (1). Czy znasz dokumentację na ten temat dla MySQL?
Zack Jannsen
1
@Thor Przeprowadzając głębsze badania, jasne jest, jaka powinna być odpowiedź. Zmiany się zdarzają i zauważyliśmy ulepszenia w tej obsłudze. Znaj swój język, który będzie w warstwie aplikacji / warstwy dostępu do danych i obsługę bibliotek. Obecnie używam Java i BIT (1) jest obecnie zalecanym wyborem dla bibliotek takich jak Hybernate i JDBC. Oto adres URL [Patrz tabela 5.2]: dev.mysql.com/doc/connector-j/en/…
Zack Jannsen
12

Dopóki MySQL nie zaimplementuje bitowego typu danych, jeśli twoje przetwarzanie jest naprawdę naciskane na przestrzeń i / lub czas, na przykład przy transakcjach o dużej objętości, utwórz pole TINYINT wywoływane bit_flagsdla wszystkich zmiennych boolowskich i zamaskuj i przesuwaj bit boolowski, którego potrzebujesz w SQL pytanie.

Na przykład, jeśli twój najbardziej lewy bit reprezentuje twoje pole bool, a 7 prawych bitów nic nie reprezentuje, wtedy twoje bit_flagspole będzie równe 128 (binarne 10000000). Zamaskuj (ukryj) siedem bitów po prawej stronie (używając operatora bitowego &) i przesuń 8 bitów siedem spacji w prawo, kończąc na 00000001. Teraz cała liczba (która w tym przypadku wynosi 1) jest twoją wartością.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

Podczas testowania możesz uruchamiać takie instrukcje

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

itp.

Ponieważ masz 8 bitów, potencjalnie masz 8 zmiennych boolowskich z jednego bajtu. Pewien przyszły programista niezmiennie używa następnych siedmiu bitów, więc musisz maskować. Nie zmieniaj się, bo w przyszłości stworzysz piekło dla siebie i innych. Upewnij się, że MySQL wykonuje maskowanie i przesuwanie - będzie to znacznie szybsze niż w przypadku języka skryptowego (PHP, ASP itp.). Upewnij się także, że umieścisz komentarz w polu komentarza MySQL dla swojego bit_flagspola.

Te witryny będą przydatne podczas wdrażania tej metody:

Jonathan
źródło
7
To wydaje się być strasznym sposobem na zaciemnienie zamiaru przyszłych programistów. Pewny wydaje się dużo trudu, by uratować 7 bajtów (zakładając, że są przy użyciu wszystkich 8 bools w tym jednym stole!)
yep
@ tak, w ogóle nie ma zaciemnienia! Napisz dokumentację i komentarze MySQL wyjaśniające każde pole w tabeli (jak wspomina odpowiedź)! Sugerowana strategia demaskowania MySQL wygląda solidnie, a przechowywanie do 16 różnych pól boolowskich za pomocą tylko kilku kolumn jest lepsze niż posiadanie 16 z nich. Jeśli jest to zbyt mylące przy użyciu manipulacji bitami i wolisz używać języka skryptów internetowych, aby uzyskać każdy wynik logiczny, po prostu zapisz go jako VARCHARi wykonaj procedurę demaskowania w kodzie (nie musisz również ograniczać go do 8 pól) ...
CPHPython
Ten BITtyp istnieje. Zobacz dev.mysql.com/doc/refman/8.0/en/bit-type.html
dolmen
10

Mam dość próbowania zer, NULLS i „” dokładnego okrążenia pętli wartości PHP, MySql i POST, więc używam po prostu „Tak” i „Nie”.

Działa to bezbłędnie i nie wymaga specjalnego traktowania, które nie jest oczywiste i łatwe do zrobienia.

Geoff Kendall
źródło
17
Jeśli naprawdę chcesz zmarnować tyle miejsca i obniżyć wydajność, mógłbyś przynajmniej wykonać CHAR (1) z opcjami Y i N.
ILikeTacos,
3
W większości rzeczywistych sytuacji istnieje prawdziwa różnica między „nie” a zwykłym brakiem informacji. Na przykład możesz chcieć domyślnie zaznaczyć pole wyboru, jeśli użytkownik nie powiedział jeszcze „nie”. Jak dokładnie myślisz, ile miejsca oszczędzasz i ile przetwarzania wykonujesz za każdym razem, gdy musisz rozróżnić fałsz od NULL - jeśli w ogóle MOŻESZ rozróżnić? W świecie przechowywanych obrazów i cyfrowych materiałów wideo oszczędność miejsca jest zupełnie nieistotna, ale czystość i zmniejszone przetwarzanie jest realne.
Geoff Kendall,
8
Ta odpowiedź nie jest zła, ponieważ zadziała i nie jest tak zła, jak ludzie ją przypisują. W przypadku większości projektów (tj. Rozmiary tabel <1mil wierszy) Różnice w wydajności między dostarczonymi rozwiązaniami będą nieistotne. Nie będę narzekać, jeśli moje zapytania powrócą za 7 do 5 milisekund ... Szczerze mówiąc, jeśli twoje stoły rosną do rzędów 10 mil lub więcej, prawdopodobnie nie jest to preferowane rozwiązanie.
Brad
1
+1 ode mnie za użycie typu danych ENUM. Osobiście wolę ten zapis: ENUM („y”, „n”). Jest kompaktowy (tylko bajt długi), intuicyjny i dobrze wygląda jako konwencja na poziomie aplikacji dla wszystkich flag boolowskich. Możesz go użyć bezpośrednio z polami formularza HTML. na przykład z PHP: <select name = "production"> <wartość opcji = "y" <? = $ production === 'y'? 'selected = "selected"': ''? >> Tak </option> <wartość opcji = "n" <? = $ production === 'n'? 'selected = "selected"': ''? >> Nie </option> </select>
Vlado
2
Lol to myślałem, ale muszę powiedzieć, że @GeoffKendall ma rację. W wielu przypadkach nie ma potrzeby optymalnej wydajności, a jakakolwiek metoda spełnia Twoje zadanie, jest właściwą metodą.
Madmenyo
6

Nawiązując do tego linku typu danych logicznych w Mysql , zgodnie z zastosowaniem aplikacji, jeśli chce się przechowywać tylko 0 lub 1, bit (1) jest lepszym wyborem.

Vidz
źródło
6
To prawda, że BIT(1)zezwoli tylko na przechowywanie wartości b'0'lub b'1'. Największym problemem związanym z BITtypem danych jest to, że różne biblioteki klienckie mają różne nieporęczne operacje na typie danych. Sprawdź zachowanie w różnych narzędziach SQL (SQLyog, TOAD for MySQL, SQL Developer), narzędziach do „odwrotnej inżynierii” modeli baz danych i różnych klientach, takich jak JDBC, PHP, Perl DBI, a dla pewności przetestuj kilka struktur ORM ( Hibernacja, Mybatis, JPA). Pod względem łatwości użytkowania TINYINT(1)wyraźnym zwycięzcą jest kompatybilność narzędzia / frameworka / natywne wsparcie .
spencer7593,
Tak. Ukończenie zależy od rozważanego środowiska aplikacji. Na przykład środowisko Phalcon w PHP nie obsługuje typu danych Bit
Vidz
Dla przypomnienia, MyBatis obsługuje zarówno BITi TINYINT. Odwołaj się do klasy JdbcType MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…
Lucky
1
@Vidz Daję ci plus za wzmiankę o BIT (1), ale chciałbym również zwrócić uwagę na programistów, którzy to czytają - Poznaj swój język, który będzie w Warstwie aplikacji / Warstwie dostępu do danych i poznaj obsługę bibliotek. Obecnie używam Java i BIT (1) jest obecnie zalecanym wyborem dla bibliotek takich jak Hybernate i JDBC. Oto adres URL [Patrz tabela 5.2]: dev.mysql.com/doc/connector-j/en/…
Zack Jannsen
6

Ponieważ zarówno MySQL (8.0.16), jak i MariaDB (10.2.1) zaimplementowały ograniczenie CHECK, użyłbym teraz

bool_val TINYINT CHECK(bool_val IN(0,1))

Będzie można tylko do sklepu 0, 1lub NULL, jak również wartości, które mogą być przekształcone 0lub 1bez błędów, takich jak '1', 0x00, b'1'lub TRUE/ FALSE.

Jeśli nie chcesz zezwalać na wartości NULL, dodaj NOT NULLopcję

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Zauważ, że nie ma praktycznie żadnej różnicy, jeśli używasz TINYINT, TINYINT(1)lub TINYINT(123).

Jeśli chcesz, aby Twój schemat był kompatybilny w górę, możesz także użyć BOOLlubBOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db <> demo skrzypiec

Paul Spiegel
źródło
co z enum (0, 1)
Santiago arizti
3
@santiagoarizti ENUM(musi być enum('0', '1')- uwaga: to są łańcuchy) nie jest dobrym pomysłem. Istnieje zbyt wiele problemów ze względu na to, jak jest przechowywany wewnętrznie i jak traktowane są wartości nie łańcuchowe. Na przykład. 0i FALSE nie mogą być przechowywane. 1i TRUEstać się '0'. I 2staje się '1'.
Paul Spiegel
Najlepsza odpowiedź ... dla osób korzystających z MySQL 8+
dolmen
2

Po przeczytaniu tutaj odpowiedzi postanowiłem użyć bit(1)i tak, jest to jakoś lepsze w czasoprzestrzeni, ALE po pewnym czasie zmieniłem zdanie i nigdy więcej go nie użyję. To bardzo skomplikowało mój rozwój, kiedy korzystałem z przygotowanych instrukcji, bibliotek itp. (Php).

Od tego czasu zawsze używam tinyint(1), wydaje się wystarczająco dobry.

Cytryny
źródło
3
Chcesz wyjaśnić, w jaki sposób skomplikowało to Twój rozwój?
Chazy Chaz,
@ChazyChaz oczekuje wartości prawda / fałsz zamiast 1/0, w przeciwieństwie do innych dbs, takich jak SQL Server. Może to czasem prowadzić do dziwnych sytuacji, w których uważasz, że ustawiasz to na prawdę, ale tak się nie dzieje.
maembe
0

Możesz użyć typu danych BOOL, BOOLEAN do przechowywania wartości logicznych.

Te typy są synonimami TINYINT (1)

Jednak typ danych BIT (1) ma sens przechowywania wartości logicznej (prawda [1] lub fałsz [0]), ale łatwiej jest pracować z TINYINT (1), gdy wysyłasz dane, zapytania i tak dalej w celu osiągnięcia interoperacyjności między MySQL i innymi bazami danych. Możesz także sprawdzić tę odpowiedź lub wątek .

MySQL konwertuje również typy danych BOOL, BOOLEAN na TINYINT (1).

Ponadto przeczytaj dokumentację

Premkumar chalmeti
źródło