Так как MySQL, похоже, не имеет никакого "логического" типа данных, какой тип данных вы "злоупотребляете" для хранения истинной/ложной информации в MySQL?
Особенно в контексте написания и чтения из/в PHP script.
Со временем я использовал и видел несколько подходов:
Ничто из вышеизложенного не кажется оптимальным. Я предпочитаю вариант tinyint 0/1, поскольку автоматическое преобразование типов в PHP дает мне логические значения довольно просто.
Какой тип данных вы используете? Есть ли тип, предназначенный для булевых значений, которые я забыл? Вы видите какие-либо преимущества/недостатки, используя тот или иной тип?
Для MySQL 5.0.3 и выше вы можете использовать BIT
. В руководстве написано:
Начиная с MySQL 5.0.3, тип данных BIT используется для хранения битового поля значения. Тип BIT (M) позволяет хранить значения 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
Кстати: это просто вопрос https://google.com/search?q=mysql+boolean+datatype.
Смешно, не так ли, эта ссылка, опубликованная несколько лет назад, стала рекурсивной.
!$boolean
никогда не оценит должным образом без дальнейшей обработки.
BOOL
и BOOLEAN
являются синонимами TINYINT(1)
. Ноль false
, все остальное true
. Подробнее здесь.
(1)
ничего не делает, кроме как определяет, как отображается значение. Если вы знаете размер хранилища, то вместо этого вы хотите использовать BIT
BIT(1)
и TINYINT(1)
будут использовать один байт памяти. Вплоть до MySQL 5.0.3 BIT
фактически был синонимом TINYINT
. Более поздние версии MySQL изменили реализацию BIT. Но даже с изменением реализации, все еще нет никакого преимущества "размера хранилища" для типа данных BIT
(по крайней мере, с InnoDB и MyISAM; другие механизмы хранения, например, NDB, могут иметь некоторую оптимизацию хранения для нескольких объявлений столбцов BIT.) Большая проблема заключается в том, что некоторые клиентские библиотеки не распознают или не обрабатывают должным образом возвращенные столбцы типа данных BIT
. TINYINT
работает лучше.
Это изящное решение, которое я вполне понимаю, потому что он использует нулевые байты данных:
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: оптимизация, резервное копирование, репликация и многое другое" Джона Уоррена Ленца, Барона Шварца и Арьена Ленца.)
На этот вопрос был дан ответ, но я решил, что брошу свои $0,02. Я часто использую CHAR (0), где '' == true и NULL == false.
От mysql docs
CHAR (0) также очень приятно, когда вам нужен столбец, который может принимать только два значения: столбец, который определяется как CHAR (0) NULL, занимает только один бит и может принимать только значения NULL и '' (пустая строка).
Если вы используете тип BOOLEAN, это псевдоним TINYINT (1). Это лучше всего, если вы хотите использовать стандартизованный SQL и не против, чтобы поле могло содержать значение вне диапазона (в основном все, что не равно 0, будет "истинным" ).
ENUM ( "False", "True" ) позволит вам использовать строки в вашем SQL, а MySQL будет хранить это поле внутри себя как целое число, где "False" = 0 и "True" = 1 на основе порядка Указано Enum.
В 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)), если у вас много логических полей. Одно битовое поле по-прежнему занимает полный байт. Два битовых поля вписываются в тот же самый байт. Три, четыре, пять, шесть, семь, восемь. После чего они начинают заполнять следующий байт. В конечном итоге экономия настолько мала, что вам нужно сосредоточиться на тысячах других оптимизаций. Если вы не имеете дело с огромным количеством данных, эти несколько байтов не будут сильно отличаться. Если вы используете бит с PHP, вам нужно придать значения значениям входов и выходов.
До тех пор, пока MySQL не реализует бит типа данных, если вы обрабатываете действительно нажатой для пространства и/или времени, например, с транзакциями с большим объемом, создайте поле TINYINT с именем bit_flags, для всех ваших логических переменных и маскируйте и сдвиньте boolean бит, который вы желаете в своем SQL-запросе.
Например, если ваш самый левый бит представляет ваше поле bool, а 7 самых правых бит ничего не представляют, тогда ваше поле бит_флаг будет равно 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 для своего поля бит_flags.
Вы найдете эти сайты полезными при реализации этого метода. http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html
VARCHAR
и выполните процедуру демаскирования в коде (вам также не нужно ограничивать его 8 полями ) ...
Мне надоело пытаться получить нули, NULLS и "точно округлить петлю значений PHP, MySql и POST, поэтому я просто использую" Да "и" Нет ".
Это работает безупречно и не требует специального лечения, которое не является очевидным и легким в использовании.
Ссылаясь на эту ссылку Boolean datatype в Mysql, в зависимости от использования приложения, если нужно сохранить только 0 или 1, лучше выбрать бит (1).
BIT(1)
позволяет b'0'
только значения b'0'
или b'1'
. Самая большая проблема с BIT
данных BIT
заключается в том, что различные клиентские библиотеки имеют различные возможности обработки этого типа. Изучите поведение в различных инструментах SQL (SQLyog, TOAD for MySQL, SQL Developer), инструментах, которые "восстанавливают" модели баз данных, и различных клиентах, таких как JDBC, PHP, Perl DBI, и для хорошей проверки протестируйте несколько сред ORM ( Hibernate, Mybatis, JPA). С точки зрения простоты использования, совместимости инструмента / фреймворка / нативной поддержки, TINYINT(1)
- явный победитель.