В чем разница между BIT и TINYINT в MySQL? - PullRequest
96 голосов
/ 14 ноября 2008

В каких случаях вы бы использовали какой? Есть ли большая разница? Что я обычно использую в персистентных движках для хранения логических значений?

Ответы [ 6 ]

110 голосов
/ 14 ноября 2008

TINYINT - это 8-битное целочисленное значение, поле BIT может хранить от 1 бита, BIT (1) до 64 бит, BIT (64). Для логических значений BIT (1) довольно распространен.

51 голосов
/ 14 ноября 2008

С Обзор числовых типов ;

BIT [(M)]

Тип битового поля. М указывает на количество бит на значение от 1 до 64. Значение по умолчанию - 1, если M не указано.

Этот тип данных был добавлен в MySQL 5.0.3 для MyISAM и расширен в 5.0.5 для MEMORY, InnoDB, BDB и NDBCLUSTER. До 5.0.3 BIT является синоним TINYINT (1).

TINYINT [(M)] [НЕ ПОДПИСАНО] [ZEROFILL]

Очень маленькое целое число. Подписанный диапазон от -128 до 127. Диапазон без знака От 0 до 255.

Дополнительно учтите это;

BOOL, BOOLEAN

Эти типы являются синонимами TINYINT (1). Нулевое значение считается ложным. Ненулевые значения считается верным.

32 голосов
/ 08 февраля 2011

Все эти теоретические обсуждения великолепны, но на самом деле, по крайней мере, если вы используете MySQL и действительно для SQLServer, лучше придерживаться недвоичных данных для ваших логических значений по той простой причине, что легче работать когда вы выводите данные, запрашиваете и так далее. Это особенно важно, если вы пытаетесь добиться взаимодействия между MySQL и SQLServer (т.е. вы синхронизируете данные между ними), потому что обработка типа данных BIT в двух из них различна. Таким образом, на практике у вас будет намного меньше хлопот, если вы будете придерживаться числового типа данных. Я бы порекомендовал MySQL придерживаться BOOL или BOOLEAN, который сохраняется как TINYINT (1). Даже то, как MySQL Workbench и MySQL Administrator отображают тип данных BIT, не очень удобно (это маленький символ для двоичных данных). Так что будьте практичны и избавьте себя от хлопот (и, к сожалению, я говорю из опыта).

11 голосов
/ 14 ноября 2008

BIT должен разрешать только 0 и 1 (и NULL, если поле не определено как NOT NULL). TINYINT (1) позволяет любое значение, которое может быть сохранено в одном байте, -128..127 или 0..255 в зависимости от того, является ли оно беззнаковым (1 показывает, что вы намереваетесь использовать только одну цифру, но это не помешает вам сохранить большее значение).

Для версий старше 5.0.3 BIT интерпретируется как TINYINT (1), поэтому разница * отсутствует.

BIT имеет семантику «это логическое значение», и некоторые приложения будут учитывать TINYINT (1) одинаково (из-за того, как MySQL использовал его для обработки), поэтому приложения могут форматировать столбец как флажок, если проверьте тип и определите формат, основанный на этом.

3 голосов
/ 14 ноября 2008

Может быть не так, но:

Tinyint является целым числом от 0 до 255

бит равен 1 или 0

Поэтому для меня бит - это выбор для логических значений

0 голосов
/ 05 мая 2014

Исходя из моего опыта, я говорю вам, что у BIT есть проблемы с типами ОС Linux (Ubuntu для ex). Я разработал свою базу данных в Windows, и после того, как я развернул все в Linux, у меня возникли проблемы с запросами, которые были вставлены или выбраны из таблиц с типом данных BIT.

Бит сейчас не безопасен. Я изменил на tinyint (1) и работал отлично. Я имею в виду, что вам нужно только значение для дифференциации, если оно равно 1 или 0, а tinyint (1) это нормально для этого

...