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



4 Answers

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

Question

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

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

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

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

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

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




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

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

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




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




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

Вы найдете эти сайты полезными при реализации этого метода. http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html




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

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

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






Related