В чем разница между BIT и TINYINT в MySQL?

106

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

перевозчик
источник

Ответы:

122

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

Роберт Гэмбл
источник
10
в чем разница между TINYINT и BIT (8)?
Pacerier
16
TINYINT может быть со знаком или без знака и относиться к отрицательным числам. Bit просто сохраняет биты без подписи данных, вам остается интерпретировать MSB самостоятельно.
определяет
4
Чтобы избежать путаницы, следует добавить, что TINYINT и BIT (1) не различаются по требованиям к хранилищу и что BOOL и BOOLEAN являются синонимами для TINYINT (1) Numeric Type Overview .
Timo Strotmann
59

Из обзора числовых типов ;

BIT [(M)]

Тип битового поля. 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). Нулевое значение считается ложным. Ненулевые значения считаются истинными.

Нельсон Миранда
источник
12
Вы говорите, что booleanэто займет байт, хотя на самом деле его совсем немного, поэтому BIT (1) лучше после v5.0.3?
Pacerier 06
3
Да @Pacerier. Boolean - это просто уродливый псевдоним для числового поля.
Áxel Costas Pena,
7
Что касается фактического хранилища, BIT (1) по-прежнему занимает минимум один байт. BIT (M) = (M + 7) / 8 байт. (1 + 7) / 8 = 1 байт. См. Требования к хранению числовых типов .
Drazen Bjelovuk
1
Печально, что BOOL/ BOOLEANявляются псевдонимами для TINYINT(1)вместо BIT. Конечно, все они в конечном итоге занимают целый байт, но семантически BITбыло бы гораздо более подходящим.
MestreLion
39

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

Шелдманду
источник
1
На мой взгляд, это не моя вина, что некоторые интерфейсы и т. Д. Неправильно интерпретируют правильные двоичные данные. Если администратор (включая меня) жалуется на какой-то символ (ссылаясь на MySQL Wrokbench), то это вина того, кто неверно истолковал мои правильные (двоичные) данные как символ, который не дает информации о содержимом. Итак, MySQL / Oracle совершили ошибку, и я не хочу менять свою концепцию программирования только потому, что кто-то допустил ошибку.
Matmarbon
11

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

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

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

Майкл Мэдсен
источник
5

Может ошибаться, но:

Tinyint - это целое число от 0 до 255.

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

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

Аллен Харди
источник
Извините, я думал, что мы здесь на T_SQL, поэтому я не знаю
Аллен Харди
0

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

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

Андрей Тибериу
источник