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

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

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

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

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

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

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

943
задан Beat 14 нояб. '08 в 13:36
источник поделиться
10 ответов

Для 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.

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

1008
ответ дан markus 14 нояб. '08 в 13:50
источник поделиться

BOOL и BOOLEAN являются синонимами TINYINT(1). Ноль false, все остальное true. Подробнее здесь.

190
ответ дан Philip Morton 14 нояб. '08 в 13:55
источник поделиться

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

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: оптимизация, резервное копирование, репликация и многое другое" Джона Уоррена Ленца, Барона Шварца и Арьена Ленца.)

61
ответ дан R. S. 10 февр. '12 в 21:09
источник поделиться

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

От mysql docs

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

31
ответ дан Josh 30 апр. '09 в 20:39
источник поделиться

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

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

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

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

23
ответ дан Ciaran McNulty 14 нояб. '08 в 17:59
источник поделиться

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

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

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

14
ответ дан Fred 14 нояб. '08 в 13:42
источник поделиться

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

13
ответ дан Thor 12 янв. '12 в 19:18
источник поделиться

До тех пор, пока 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

10
ответ дан Jonathan 13 июля '11 в 20:13
источник поделиться

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

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

7
ответ дан Geoff Kendall 09 июля '12 в 23:10
источник поделиться

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

3
ответ дан Vidz 23 февр. '15 в 13:41
источник поделиться

Другие вопросы по меткам