типы - unsigned mysql




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

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

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

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

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

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

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


Бит полезен только по различным байтовым опциям (tinyint, enum, char (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.

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

BTW: это всего лишь вопрос https://google.com/search?q=mysql+boolean+datatype .

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


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

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


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

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

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


Пока MySQL не реализует бит типа данных, если ваша обработка действительно нажата для пробела и / или времени, например, с транзакциями с большим объемом, создайте поле 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 и т. Д.). Кроме того, убедитесь, что вы разместили комментарий в поле комментариев MySQL для поля bit_flags .

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


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

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


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

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

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


BOOL и BOOLEAN являются синонимами TINYINT(1) . Zero является false , все остальное true . Дополнительная информация here .





sqldatatypes