Яка різниця між BIT і TINYINT в MySQL?


106

У яких випадках ви б використовували які? Чи багато різниці? Які я, як правило, використовуються двигунами для збереження булей?

Відповіді:


122

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


10
яка різниця між TINYINT і BIT (8)?
Pacerier

16
TINYINT може бути підписаний або без підпису і стосуватися негативних чисел. Біт просто зберігає біти без підписання даних, вам залишається самостійно інтерпретувати MSB.
визначається

4
Щоб уникнути плутанини, слід додати, що TINYINT та BIT (1) не відрізняються своїми вимогами до зберігання і що BOOL та BOOLEAN є синонімами TINYINT (1) Огляд числових типів .
Тімо Стротманн

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)] [UNIGNED] [ZEROFILL]

Дуже маленьке ціле число. Діапазон підписаних значень - від -128 до 127. Непідписаний діапазон - від 0 до 255.

Додатково врахуйте це;

БУЛЬ, БУЛЕЙ

Ці типи є синонімами TINYINT (1). Значення нуля вважається помилковим. Ненульові значення вважаються істинними.


12
Ви говорите, що booleanбудете займати байт, хоча його дійсно трохи, тож BIT (1) краще після v5.0.3?
Pacerier

3
Так @Pacerier. Булевий просто некрасивий псевдонім для числового поля.
Аксель Костас Пена

7
Що стосується фактичного зберігання, BIT (1) все ще займає один байт мінімум. BIT (M) = (M + 7) / 8 байт. (1 + 7) / 8 = 1 байт. Див . Вимоги до зберігання цифрових типів .
Дражен Беловук

1
Сумно , що BOOL/ BOOLEANпсевдоніми для TINYINT(1)замість BIT. Звичайно, всі вони займають цілий байт, але семантично BITбуло б набагато доречніше.
MestreLion

38

Усі ці теоретичні дискусії чудові, але насправді, принаймні, якщо ви також використовуєте MySQL, а також для SQLServer, найкраще дотримуватися небінарних даних для ваших булевих служб з тієї простої причини, що з вами легше працювати, коли вам виводить дані, запити тощо. Це особливо важливо, якщо ви намагаєтеся досягти сумісності між MySQL та SQLServer (тобто ви синхронізуєте дані між двома), оскільки обробка типу BIT даних відрізняється у двох. Так на практиці у вас буде набагато менше клопотів, якщо ви будете дотримуватися числового типу даних. Я рекомендую MySQL дотримуватися BOOL або BOOLEAN, який зберігається як TINYINT (1). Навіть те, як MySQL Workbench та MySQL Administrator відображають тип даних BIT, не є приємним (це маленький символ для двійкових даних).


1
На мою думку, я не винен, що деякі інтерфейси тощо інтерпретують неправильні бінарні дані неправильно. Якщо адміністратор (в тому числі я) скаржиться на якийсь символ (посилаючись на MySQL Wrokbench), то це вина в тому, хто неправильно трактував мої правильні (бінарні) дані як символ, який не дає ніякої інформації про вміст. Тож MySQL / Oracle допустив помилку, і я не бажаю змінювати свою програму програмування лише тому, що хтось допустив помилку.
Матмарбон

11

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

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

У BIT є семантичний "це булевий", і деякі додатки будуть вважати TINYINT (1) тим же способом (завдяки способу, який MySQL використовував для цього), тому програми можуть відформатувати стовпчик як прапорець, якщо вони встановили прапорець і прийняти рішення про формат, заснований на цьому.


4

Можливо, не так, але:

Tinyint - це ціле число між 0 і 255

біт або 1, або 0

Тому для мене біт - це вибір для булів


Вибачте, подумав, що ми тут на T_SQL, тому я не знаю
Аллен Харді

0

Зі свого досвіду я кажу вам, що BIT має проблеми з типами ОС Linux (Ubuntu for ex). Я розробив свій db для Windows, і після того, як я розгорнув усе на Linux, у мене виникли проблеми із запитами, які вставляли або вибирали з таблиць, які мали тип BIT DATA.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.