Какой тип данных MySQL используется для хранения логических значений
Так как MySQL, похоже, не имеет никакого "логического" типа данных, какой тип данных вы "злоупотребляете" для хранения истинной/ложной информации в MySQL?
Особенно в контексте написания и чтения из/в PHP script.
Со временем я использовал и видел несколько подходов:
- tinyint, поля varchar, содержащие значения 0/1,
- поля varchar, содержащие строки '0'/'1' или 'true'/'false'
- и, наконец, перечислить поля, содержащие два параметра: "true" / "false".
Ничто из вышеизложенного не кажется оптимальным. Я предпочитаю вариант tinyint 0/1, поскольку автоматическое преобразование типов в PHP дает мне логические значения довольно просто.
Какой тип данных вы используете? Есть ли тип, предназначенный для булевых значений, которые я забыл? Вы видите какие-либо преимущества/недостатки, используя тот или иной тип?
Ответы
Ответ 1
Для 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
Ответ 2
BOOL
и BOOLEAN
являются синонимами TINYINT(1)
. Ноль false
, все остальное true
. Подробнее здесь.
Ответ 3
Это изящное решение, которое я вполне понимаю, потому что он использует нулевые байты данных:
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: оптимизация, резервное копирование, репликация и многое другое" Джона Уоррена Ленца, Барона Шварца и Арьена Ленца.)
Ответ 4
На этот вопрос был дан ответ, но я решил, что брошу свои $0,02. Я часто использую CHAR (0), где '' == true и NULL == false.
От mysql docs
CHAR (0) также очень приятно, когда вам нужен столбец, который может принимать только два значения: столбец, который определяется как CHAR (0) NULL, занимает только один бит и может принимать только значения NULL и '' (пустая строка).
Ответ 5
Если вы используете тип BOOLEAN, это псевдоним TINYINT (1). Это лучше всего, если вы хотите использовать стандартизованный SQL и не против, чтобы поле могло содержать значение вне диапазона (в основном все, что не равно 0, будет "истинным" ).
ENUM ( "False", "True" ) позволит вам использовать строки в вашем SQL, а MySQL будет хранить это поле внутри себя как целое число, где "False" = 0 и "True" = 1 на основе порядка Указано Enum.
В MySQL 5+ вы можете использовать поле BIT (1) для указания 1-битного числового типа. Я не верю, что это фактически использует меньше места в хранилище, но снова позволяет ограничить возможные значения 1 или 0.
Все вышеперечисленное будет использовать примерно такое же количество памяти, поэтому лучше всего выбрать тот, с которым вы легко справитесь.
Ответ 6
Я использую TINYINT (1) для хранения логических значений в Mysql.
Я не знаю, есть ли какие-либо преимущества для использования этого... Но если я не ошибаюсь, mysql может хранить логическое значение (BOOL) и хранить его как tinyint (1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
Ответ 7
Бит полезен только по различным байтовым опциям (tinyint, enum, char (1)), если у вас много логических полей. Одно битовое поле по-прежнему занимает полный байт. Два битовых поля вписываются в тот же самый байт. Три, четыре, пять, шесть, семь, восемь. После чего они начинают заполнять следующий байт. В конечном итоге экономия настолько мала, что вам нужно сосредоточиться на тысячах других оптимизаций. Если вы не имеете дело с огромным количеством данных, эти несколько байтов не будут сильно отличаться. Если вы используете бит с PHP, вам нужно придать значения значениям входов и выходов.
Ответ 8
До тех пор, пока MySQL не реализует битовый тип данных, если ваша обработка действительно ограничена пространством и/или временем, например, при транзакциях большого объема, создайте поле bit_flags
именем bit_flags
для всех ваших логических переменных и маскируйте и 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 и т.д.). Также убедитесь, что вы bit_flags
комментарий в поле комментариев MySQL для своего поля bit_flags
.
Вы найдете эти сайты полезными при реализации этого метода:
Ответ 9
Мне надоело пытаться получить нули, NULLS и "точно округлить петлю значений PHP, MySql и POST, поэтому я просто использую" Да "и" Нет ".
Это работает безупречно и не требует специального лечения, которое не является очевидным и легким в использовании.
Ответ 10
Ссылаясь на эту ссылку Boolean datatype в Mysql, в зависимости от использования приложения, если нужно сохранить только 0 или 1, лучше выбрать бит (1).
Ответ 11
Прочитав ответы здесь, я решил использовать bit(1)
и да, это как-то лучше в пространстве/времени, НО через некоторое время я передумал и никогда больше не буду его использовать. Это сильно усложнило мою разработку при использовании готовых операторов, библиотек и т.д. (Php).
С тех пор я всегда использую tinyint(1)
, кажется достаточно хорошим.
Ответ 12
Поскольку 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))
ДБ <> Fiddle Demo