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

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

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

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

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

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

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

Ответы [ 12 ]

1163 голосов
/ 14 ноября 2008

Для MySQL 5.0.3 и выше вы можете использовать BIT. В руководстве написано:

Начиная с MySQL 5.0.3, тип данных BIT используется для хранения битового поля ценности. Тип BIT (M) позволяет хранить M-битные значения. М может варьироваться от 1 до 64.

В противном случае, согласно руководству по MySQL, вы можете использовать bool и boolean, которые на данный момент имеют псевдонимы tinyint (1):

Bool, Boolean: Эти типы являются синонимами для TINYINT (1). Значение ноль считается ложным. Ненулевая значения считаются истинными.

MySQL также заявляет, что:

Мы намерены реализовать полный логический тип обработки, в соответствии с стандартный SQL, в будущем MySQL релиз.

Рекомендации: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

226 голосов
/ 14 ноября 2008

BOOL и BOOLEAN являются синонимами TINYINT(1). Ноль - false, все остальное - true. Больше информации здесь .

67 голосов
/ 10 февраля 2012

Это элегантное решение, которое я очень ценю, поскольку оно использует ноль байтов данных:

some_flag CHAR(0) DEFAULT NULL

Чтобы установить его в значение true, установите some_flag = '', а в качестве значения false установите some_flag = NULL.

Затем, чтобы проверить на true, проверить, если some_flag IS NOT NULL, и проверить на false, проверить, если some_flag IS NULL.

(Этот метод описан в статье «Высокопроизводительные MySQL: оптимизация, резервное копирование, репликация и многое другое» Джона Уоррена Ленца, барона Шварца и Арьена Ленца.)

34 голосов
/ 30 апреля 2009

На этот вопрос ответили, но я решил добавить свои 0,02 доллара. Я часто использую CHAR (0), где '' == true и NULL == false.

Из MySQL документов

CHAR (0) также довольно хорошо, когда вам нужен столбец, который может принимать только два значения: столбец, определенный как CHAR (0) NULL, занимает только одно бит и может принимать только значения NULL и '' (пустая строка).

32 голосов
/ 14 ноября 2008

Если вы используете тип BOOLEAN, это псевдоним TINYINT (1). Это лучше всего, если вы хотите использовать стандартизированный SQL и не обращать внимания на то, что поле может содержать значение вне диапазона (в основном все, что не равно 0, будет «истинным»).

ENUM («False», «True») позволит вам использовать строки в вашем SQL, а MySQL будет хранить поле внутри как целое число, где «False» = 0 и «True» = 1 в зависимости от порядка Enum указан.

В MySQL 5+ вы можете использовать поле BIT (1) для обозначения 1-битного числового типа. Я не верю, что на самом деле это занимает меньше места в хранилище, но опять же позволяет ограничить возможные значения до 1 или 0.

Все вышеперечисленное будет использовать примерно одинаковый объем памяти, поэтому лучше выбрать тот, с которым вам проще всего работать.

18 голосов
/ 14 ноября 2008

Я использую TINYINT (1) для хранения логических значений в Mysql.

Я не знаю, есть ли какое-то преимущество в использовании этого ... Но если я не ошибаюсь, mysql может хранить логическое значение (BOOL) и хранить его как tinyint (1)

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

16 голосов
/ 12 января 2012

Бит имеет преимущество перед различными байтовыми опциями (tinyint, enum, char (1)), если у вас много логических полей. Одно битовое поле все еще занимает полный байт. Два битовых поля вписываются в один и тот же байт. Три, четыре, пять, шесть, семь, восемь. После чего они начинают заполнять следующий байт. В конечном итоге экономия настолько мала, что вы должны сосредоточиться на тысячах других оптимизаций. Если вы не имеете дело с огромным количеством данных, эти несколько байтов не будут складываться во много. Если вы используете бит с PHP, вам нужно ввести значения, входящие и выходящие.

13 голосов
/ 13 июля 2011

Пока MySQL не реализует битовый тип данных, если ваша обработка действительно ограничена пространством и / или временем, например, при транзакциях с большим объемом, создайте поле TINYINT с именем bit_flags для всех ваших логических переменных, а также маскируйте и сдвигайте логическое значение бит, который вы хотите в вашем запросе SQL.

Например, если ваш самый левый бит представляет ваше поле bool, а 7 самых правых битов ничего не представляют, тогда ваше поле bit_flags будет равно 128 (двоичный код 10000000). Маскируйте (скрывайте) семь крайних правых битов (используя побитовый оператор &) и сдвигайте 8-й бит на семь пробелов вправо, заканчивая 00000001. Теперь все число (которое в данном случае равно 1) является вашим значение.

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

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

Вы можете запускать подобные выражения при тестировании

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

и т.д.

Поскольку у вас есть 8 битов, у вас есть потенциально 8 логических переменных из одного байта. Некоторые будущие программисты всегда будут использовать следующие семь битов, поэтому вы должны замаскировать. Не сдвигайтесь, иначе вы создадите ад для себя и других в будущем. Убедитесь, что MySQL выполняет маскирование и сдвиг - это будет значительно быстрее, чем это делает язык веб-сценариев (PHP, ASP и т. Д.). Также убедитесь, что вы поместили комментарий в поле комментария MySQL для своего поля bit_flags.

Эти сайты будут полезны при реализации этого метода:

10 голосов
/ 10 июля 2012

Я сыт по горло попытками получить нули, NULLS и «точно» в цикле значений PHP, MySql и POST, поэтому я просто использую «Да» и «Нет».

Это работает безупречно и не требует специальной обработки, которая неочевидна и проста для выполнения.

6 голосов
/ 23 февраля 2015

Ссылаясь на эту ссылку Логический тип данных в Mysql , в соответствии с использованием приложения, если требуется сохранить только 0 или 1, бит (1) является лучшим выбором.

...