Какой тип данных MySQL использовать для хранения логических значений - PullRequest
1116 голосов
/ 14 ноября 2008

Поскольку в MySQL, похоже, нет никакого «логического» типа данных, какой тип данных вы «используете» для хранения истинной / ложной информации в MySQL?

Особенно в контексте написания и чтения из / в скрипт PHP.

Со временем я использовал и видел несколько подходов:

  • tinyint, поля varchar, содержащие значения 0/1,
  • поля varchar, содержащие строки '0' / '1' или 'true' / 'false'
  • и, наконец, перечисление Поля, содержащие две опции 'true' / 'false'.

Ничто из вышеперечисленного не кажется оптимальным. Я обычно предпочитаю вариант tinyint 0/1, поскольку автоматическое преобразование типов в PHP дает мне логические значения довольно просто.

Так какой тип данных вы используете? Есть ли тип, разработанный для логических значений, который я пропустил? Видите ли вы какие-либо преимущества / недостатки при использовании того или иного типа?

Ответы [ 12 ]

1 голос
/ 26 июня 2018

Прочитав ответы здесь, я решил использовать bit(1), и да, как-то лучше в пространстве / времени, НО , через некоторое время я передумал и больше никогда не буду его использовать. Это сильно усложнило мою разработку при использовании подготовленных операторов, библиотек и т. Д. (Php).

С тех пор я всегда использую tinyint(1), кажется достаточно хорошим.

0 голосов
/ 26 мая 2019

Поскольку MySQL (8.0.16) и MariaDB (10.2.1) реализовали ограничение CHECK, я бы теперь использовал

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

Вы сможете хранить только 0, 1 или NULL, а также значения, которые можно преобразовать в 0 или 1 без ошибок, таких как '1', 0x00, b'1' или TRUE / FALSE.

Если вы не хотите разрешать NULL, добавьте параметр NOT NULL

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

Обратите внимание, что разницы практически нет, если вы используете TINYINT, TINYINT(1) или TINYINT(123).

Если вы хотите, чтобы ваша схема была совместимой вверх, вы также можете использовать BOOL или BOOLEAN

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

db <> fiddle demo

...