Какой тип данных MySQL использовать для хранения логических значений

StackOverflow https://stackoverflow.com/questions/289727

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Bool, Логическое значение:Эти типы являются синонимами для КРОШЕЧНЫЙ КУСОЧЕК(1).Значение, равное нулю, считается ложным.Ненулевые значения считаются истинными.

MySQL также утверждает , что:

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

Ссылки: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

Другие советы

BOOL и BOOLEAN являются синонимами TINYINT(1).Ноль равен false, что - нибудь еще есть true.Дополнительная информация здесь.

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

some_flag CHAR(0) DEFAULT NULL

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

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

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

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

От документы mysql

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

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

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

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

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

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

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

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

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

Пока 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 поле.

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

Мне надоело пытаться получить нули и "точно закруглить цикл значений PHP, MySQL и POST", поэтому я просто использую "Да" и "Нет".

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

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

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

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

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

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

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

Если вы не хотите разрешать нули, добавьте 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))

дб<> демо-версия скрипки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top