Jakiego typu danych MySQL użyć do przechowywania wartości logicznych

Ponieważ MySQL nie wydaje się mieć żadnego typu danych 'boolean', który typ danych "nadużywasz" do przechowywania prawdziwych / fałszywych informacji w MySQL?

Szczególnie w kontekście pisania i czytania ze skryptu PHP.

Z biegiem czasu używałem i widziałem kilka podejść:

  • tinyint, pola varchar zawierające wartości 0/1,
  • pola varchar zawierające ciągi znaków " 0 " / " 1 " lub "true" / "false"
  • i wreszcie pola enum zawierające dwa opcje "true" / "false".

Żadne z powyższych nie wydaje się optymalne. Preferuję wariant tinyint 0/1, ponieważ Automatyczna konwersja typu w PHP daje mi wartości logiczne raczej po prostu.

Jakiego typu danych używasz? Czy istnieje typ przeznaczony dla wartości logicznych, które przeoczyłem? Czy widzisz jakieś zalety/wady przy użyciu jednego typu lub innego?

Author: Peter Mortensen, 2008-11-14

13 answers

Dla MySQL 5.0.3 i wyższych, można użyć BIT. Instrukcja mówi:

Począwszy od MySQL 5.0.3, typ danych BIT jest używany do przechowywania pola bitowego wartości. Typ bitów (M) umożliwia przechowywanie wartości M-bitów. Zasięg M od 1 do 64.

W Przeciwnym Razie, zgodnie z instrukcją MySQL można użyć BOOL lub BOOLEAN, które są w tej chwili aliasami tinyint(1):

Bool, Boolean: te typy są synonimami TINYINT (1). Wartość zero jest rozpatrywane fałsz. Niezerowe wartości są uważane za prawdziwe.

MySQL stwierdza również, że:

Zamierzamy zaimplementować pełny boolean obsługa typu, zgodnie z standard SQL, w przyszłości MySQL uwolnij.

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

 1269
Author: markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-24 06:35:19

BOOL i BOOLEAN są synonimami TINYINT(1). Zero to false, Wszystko inne to true. Więcej informacji tutaj .

 259
Author: Philip Morton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 10:55:02

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

some_flag CHAR(0) DEFAULT NULL

Aby ustawić na true, Ustaw some_flag = '' i ustaw na false, Ustaw some_flag = NULL.

Następnie, aby sprawdzić na true, sprawdź if some_flag IS NOT NULL, A aby sprawdzić na false, sprawdź if some_flag IS NULL.

(metoda ta została opisana w "High Performance MySQL: Optimization, Backups, Replication, and More" autorstwa Jona Warrena Lentza, Barona Schwartza i Arjena Lentza.)

 75
Author: R. S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 20:36:12

To pytanie zostało udzielone, ale pomyślałem, że dorzucę swoje $0.02. Często używam CHAR(0), gdzie '' == true and NULL == false.

From MySQL docs :

CHAR(0) jest również całkiem miły, gdy potrzebujesz kolumny, która może zająć tylko dwie wartości: kolumna zdefiniowana jako CHAR(0) NULL zajmuje tylko jedną bit i może przyjmować tylko wartości NULL i '' (pusty łańcuch).

 36
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-19 11:25:39

Jeśli używasz typu BOOLEAN, jest to aliasowane do tinyint(1). Jest to najlepsze, jeśli chcesz użyć standaryzowanego SQL i nie przejmuj się, że pole może zawierać wartość spoza zakresu (w zasadzie wszystko, co nie jest 0, będzie 'prawdziwe').

ENUM ('False',' True') pozwoli Ci używać łańcuchów w Twoim SQL, a MySQL będzie przechowywać pole wewnętrznie jako liczbę całkowitą, gdzie'False '=0 i'True' =1 w zależności od kolejności, w jakiej Enum jest określone.

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

Wszystkie powyższe będą zużywać mniej więcej taką samą ilość miejsca, więc najlepiej wybrać ten, z którym najłatwiej pracować.

 33
Author: Ciaran McNulty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 14:59:29

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

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

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

 18
Author: Fred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 10:42:51

Bit jest korzystny tylko nad różnymi opcjami bajtów(tinyint, enum, char (1)), Jeśli masz dużo pól logicznych. Jedno pole bitowe zajmuje cały bajt. Dwa pola bitowe pasują do tego samego bajtu. Trzy, cztery, pięć, sześć, siedem, osiem. Po czym 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ć. Jeśli nie masz do czynienia z ogromną ilością danych, te kilka bajtów nie sumuje się do much. Jeśli używasz bit z PHP, musisz wpisać wartości wchodzące i wychodzące.

 18
Author: Thor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 16:18:54

Dopóki MySQL nie zaimplementuje bitowego typu danych, jeśli przetwarzanie jest naprawdę naciśnięte dla przestrzeni i / lub czasu, na przykład w przypadku transakcji o dużej objętości, Utwórz pole TINYINT o nazwie bit_flags dla wszystkich zmiennych logicznych, a następnie zamaskuj i przesuń żądany bit logiczny w zapytaniu SQL.

Na przykład, jeśli twój lewy bit reprezentuje twoje pole bool, a 7 prawych bitów reprezentuje nic, to Twoje bit_flags pole będzie równe 128 (binarne 10000000). Zamaskować (ukryć) siedem prawych bitów (za pomocą operator bitowy &) i przesunięcie ósmego bitu o 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)

Możesz uruchamiać takie instrukcje podczas testowania

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

Itd.

Ponieważ masz 8 bitów, potencjalnie masz 8 zmiennych logicznych z jednego bajtu. Jakiś przyszły programista będzie zawsze używał kolejnych siedmiu bitów, więc ty musisz maskować. Nie tylko się przesuń, bo stworzysz piekło dla siebie i inne w przyszłości. Upewnij się, że MySQL wykonuje maskowanie i przesuwanie-będzie to znacznie szybsze niż posiadanie języka skryptowego (PHP, ASP itp. zrób to. Upewnij się również, że umieściłeś komentarz w polu komentarza MySQL dla swojego pola bit_flags.

Znajdziesz te strony przydatne przy implementacji tej metody:

 12
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 16:09:32

Miałem dość prób uzyskiwania zer, null i "dokładnie zaokrąglania pętli wartości PHP, MySql i post, więc używam tylko" Tak " i "nie".

To działa bez zarzutu i nie wymaga specjalnego traktowania, które nie jest oczywiste i łatwe do zrobienia.

 10
Author: Geoff Kendall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-03 13:55:53

Odwołując się do tego linku Boolean datatype w Mysql , w zależności od użycia aplikacji, jeśli chce się zapisać tylko 0 LUB 1, bit(1) jest lepszym wyborem.

 6
Author: Vidz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:42:36

Ponieważ MySQL (8.0.16) i MariaDB (10.2.1) zaimplementowały ograniczenie sprawdzania, użyłbym teraz

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

Będziesz mógł przechowywać tylko 0, 1 lub NULL, a także wartości, które można przekonwertować na 0 lub 1 bez błędów, takich jak '1', 0x00, b'1' lub TRUE/FALSE.

Jeśli nie chcesz zezwalać na null, Dodaj opcję NOT NULL

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

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

If you want your aby schemat był zgodny w górę, można również użyć BOOL lub BOOLEAN

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

Db demo fiddle

 6
Author: Paul Spiegel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-26 17:53:19

Po przeczytaniu odpowiedzi postanowiłem użyć bit(1)i tak, jest jakoś lepiej w czasoprzestrzeni, ale Po jakimś czasie zmieniłem zdanie i już nigdy go nie użyję. Bardzo skomplikowało to mój rozwój przy użyciu gotowych instrukcji, bibliotek itp. (php).

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

 3
Author: Lemures,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 10:14:10

Do przechowywania wartości logicznych można użyć typu danych BOOL, BOOLEAN.

Rodzaje te są synonimami TINYINT (1)

Jednak typ danych BIT(1) ma większy sens do przechowywania wartości logicznej (true[1] lub false[0]), ale TINYINT(1) jest łatwiejszy do pracy podczas wysyłania danych, zapytań itp., a także w celu osiągnięcia interoperacyjności między MySQL i innymi bazami danych. Możesz również sprawdzić tę odpowiedź lub wątek .

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

Dalej, przeczytaj dokumentacja

 1
Author: Premkumar chalmeti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-26 10:43:59