Поскольку в MySQL, похоже, нет какого-либо «логического» типа данных, какой тип данных вы «используете» для хранения истинной / ложной информации в MySQL?
Особенно в контексте написания и чтения из / в сценарий PHP.
Со временем я использовал и видел несколько подходов:
- tinyint, поля varchar, содержащие значения 0/1,
- поля varchar, содержащие строки '0' / '1' или 'true' / 'false'
- и, наконец, перечислить поля, содержащие две опции 'true' / 'false'.
Ничто из вышеперечисленного не кажется оптимальным. Я предпочитаю вариант tinyint 0/1, так как автоматическое преобразование типов в PHP дает мне логические значения довольно просто.
Так какой тип данных вы используете? Есть ли тип, разработанный для логических значений, который я пропустил? Видите ли вы какие-либо преимущества / недостатки при использовании того или иного типа?
mysql
boolean
sqldatatypes
Питер Мортенсен
источник
источник
bit(1)
бит ** для импорта в Excel. Переход наtinyint(1)
работы.Ответы:
Для MySQL 5.0.3 и выше вы можете использовать
BIT
. В руководстве сказано:В противном случае, согласно руководству MySQL, вы можете использовать bool и boolean, которые на данный момент являются псевдонимами tinyint (1):
MySQL также заявляет, что:
Ссылки: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
источник
!$boolean
который никогда не будет оцениваться должным образом без дальнейшей обработки.auto_increment
столбец, представляющий логическое значение?BOOL
иBOOLEAN
являются синонимамиTINYINT(1)
. Ноль естьfalse
, все остальное естьtrue
. Больше информации здесь .источник
(1)
не что иное, как определение того, как отображается значение. Если вы помните о размере хранилища, тоBIT
вместо этого вы захотите его использоватьBIT(1)
иTINYINT(1)
оба будут использовать один байт памяти. Вплоть до MySQL 5.0.3BIT
фактически был синонимомTINYINT
. Более поздние версии MySQL изменили реализацию BIT. Но даже с изменением реализации, все еще нет никакого преимущества "размера хранилища" дляBIT
типа данных (по крайней мере, с InnoDB и MyISAM; другие механизмы хранения, например NDB, могут иметь некоторую оптимизацию хранения для нескольких объявлений столбцов BIT.) Большая проблема заключается в том, что некоторый клиент библиотеки не распознают или не обрабатывают должным образом возвращаемыеBIT
столбцы типов данных. АTINYINT
работает лучше.true
» не соответствует действительности.SELECT 'foo' AS bar FROM dual WHERE -7
. Выражение -7 вычисляется в логическом контексте, и запрос возвращает строку. Мы можем проверить с 0 или любым выражением, которое оценивается как целочисленное значение 0, и строка не возвращается. Если выражение в предложении WHERE оценивается как любое ненулевое целочисленное значение, отличное от нуля, выражение имеет значение ИСТИНА. (Я полагаю, что десятичные значения и значения с плавающей запятой округляются до целого числа, например,WHERE 1/3
оцениваются доWHERE 0
. Мы получаем тот же результат сWHERE 'foo'
, потому что строка'foo'
также оценивается как целое значение 0.Это элегантное решение, которое я очень ценю, поскольку оно использует ноль байтов данных:
Чтобы установить его в значение true, установите
some_flag = ''
и установите в значение false, установитеsome_flag = NULL
.Затем, чтобы проверить на true, проверить, если some_flag
IS NOT NULL
, и проверить на false, проверить, если some_flagIS NULL
.(Этот метод описан в статье «Высокопроизводительный MySQL: оптимизация, резервное копирование, репликация и многое другое» Джона Уоррена Ленца, Барона Шварца и Арьена Ленца.)
источник
COMMENT
в столбце, котороеNULL
указывает на ложь и''
указывает на истину, может пойти очень маленьким путем, помогающим пониманию будущего.Если вы используете тип BOOLEAN, это псевдоним TINYINT (1). Это лучше всего, если вы хотите использовать стандартизированный SQL и не обращать внимания на то, что поле может содержать значение вне диапазона (в основном все, что не равно 0, будет «истинным»).
ENUM («False», «True») позволит вам использовать строки в вашем SQL, а MySQL будет хранить поле внутри как целое число, где «False» = 0 и «True» = 1 в зависимости от порядка, указанного Enum ,
В MySQL 5+ вы можете использовать поле BIT (1) для обозначения 1-битного числового типа. Я не верю, что на самом деле это занимает меньше места в хранилище, но опять же позволяет ограничить возможные значения до 1 или 0.
Все вышеперечисленное будет использовать примерно одинаковый объем памяти, поэтому лучше выбрать тот, с которым вам проще всего работать.
источник
На этот вопрос ответили, но я решил добавить свои 0,02 доллара. Я часто использую
CHAR(0)
, где'' == true and NULL == false
.Из документов MySQL :
источник
''
иnull
являются ложными значениями.Я использую 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
для всех ваших логических переменных, и маскируйте и сдвигайте нужный логический бит в своем SQL запрос.Например, если ваш самый левый бит представляет ваше поле bool, а 7 самых правых битов ничего не представляют, тогда ваше
bit_flags
поле будет равно 128 (двоичный код 10000000). Маскируйте (скрывайте) семь крайних правых битов (используя побитовый оператор&
) и сдвигайте 8-й бит на семь пробелов вправо, заканчивая 00000001. Теперь все значение (которое в данном случае равно 1) является вашим значением.Вы можете запускать такие заявления во время тестирования
и т.п.
Поскольку у вас есть 8 битов, у вас есть потенциально 8 логических переменных из одного байта. Некоторые будущие программисты всегда будут использовать следующие семь битов, поэтому вы должны замаскировать. Не просто сдвиньтесь, иначе вы создадите ад для себя и других в будущем. Убедитесь, что MySQL выполняет маскирование и сдвиг - это будет значительно быстрее, чем это делает язык веб-сценариев (PHP, ASP и т. Д.). Кроме того, убедитесь, что вы поместили комментарий в поле комментариев MySQL для своего
bit_flags
поля.Вы найдете эти сайты полезными при реализации этого метода:
источник
VARCHAR
и выполните процедуру демаскирования в коде (вам также не нужно ограничивать его 8 полями) ...BIT
Типа существует. См. Dev.mysql.com/doc/refman/8.0/en/bit-type.htmlЯ сыт по горло попытками получить нули, NULLS и «точно» в цикле значений PHP, MySql и POST, поэтому я просто использую «Да» и «Нет».
Это работает безупречно и не требует особой обработки, которая не очевидна и проста в исполнении.
источник
Ссылаясь на эту ссылку, Boolean datatype в Mysql , в соответствии с использованием приложения, если кто-то хочет сохранить только 0 или 1, бит (1) является лучшим выбором.
источник
BIT(1)
только позволитb'0'
илиb'1'
значение будет сохранено. Самая большая проблема сBIT
типом данных заключается в том, что различные клиентские библиотеки имеют различные возможности обработки этого типа данных. Изучите поведение в различных инструментах SQL (SQLyog, TOAD for MySQL, SQL Developer), инструментах, которые "восстанавливают" модели баз данных, а также на различных клиентах, таких как JDBC, PHP, Perl DBI, и для хорошей проверки протестируйте несколько сред ORM ( Hibernate, Mybatis, JPA). С точки зрения простоты использования, инструментальная / совместимая среда / нативная поддержкаTINYINT(1)
- явный победитель.BIT
иTINYINT
. Обратитесь к классу MyBatis JdbcType, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Поскольку MySQL (8.0.16) и MariaDB (10.2.1) реализовали ограничение CHECK, я бы сейчас использовал
Вы сможете только в магазине
0
,1
илиNULL
, а также значения , которые могут быть преобразованы в0
или1
без ошибок , как'1'
,0x00
,b'1'
илиTRUE
/FALSE
.Если вы не хотите разрешать NULL, добавьте
NOT NULL
опциюОбратите внимание, что практически нет разницы, если вы используете
TINYINT
,TINYINT(1)
илиTINYINT(123)
.Если вы хотите, чтобы ваша схема была совместимой вверх, вы также можете использовать
BOOL
илиBOOLEAN
ДБ <> Fiddle Demo
источник
ENUM
(должно быть,enum('0', '1')
обратите внимание: это строки) не очень хорошая идея. Есть слишком много вопросов , из - за того , как она хранится внутри, и как нестроковые значения обрабатываются. Например.0
иFALSE
не может быть сохранен.1
иTRUE
стать'0'
. И2
становится'1'
.Прочитав ответы здесь я решил использовать
bit(1)
и да, как-то лучше в пространстве / времени, НО через некоторое время я передумал и никогда больше не буду его использовать. Это сильно усложнило мою разработку при использовании готовых операторов, библиотек и т. Д. (Php).С тех пор я всегда использую
tinyint(1)
, кажется, достаточно хорошо.источник
Вы можете использовать тип данных BOOL, BOOLEAN для хранения логических значений.
Однако тип данных BIT (1) имеет больше смысла для хранения логического значения (true [1] или false [0]), но с TINYINT (1) легче работать, когда вы выводите данные, запрашиваете и т. Д. и для достижения совместимости между MySQL и другими базами данных. Вы также можете проверить этот ответ или тему .
Далее читайте документацию
источник