Булеві та tinyint (1) для булевих значень у MySQL


124

Який тип стовпців найкраще використовувати в базі даних MySQL для булевих значень? Я використовую, booleanале використовує мій колега tinyint(1).


3
Схоже, MySQL прозоро трактує booleanяк tinyint(1). Таким чином, ви можете використовувати boolean, trueі falseі MySQL розглядає їх як tinyint(1), 1і 0.
ADTC

Інший випадок - це символ 1 з Y&N, який, мабуть, деякі люди швидше.
Зон

Відповіді:


153

Ці типи даних є синонімами.


6
Я б не сказав, що типи даних є синонімами - tinyint (1) - це те саме, що bool, але tinyint і bool - це не те саме. Незначна точка, але ваша відповідь спонукала мене, коли я прочитав її
Кайл Чадха

2
Це не відповідає на запитання. Хоча правда, що tinyint (1) функціонально ідентичний bool, ОП запитав, що найкраще використовувати. Відповідь @dj_segfault робить належну роботу, пояснюючи, чому при зберіганні булевого значення слід віддавати перевагу bool над tinyint (1).
Кайл Морган

87

Я збираюся застосувати інший підхід і припускаю, що ваші колеги-розробники так само важливо розуміти ваш код, як і для компілятора / бази даних. Використання булевого може зробити те ж саме, що і tinyint, однак це має перевагу в тому, щоб семантично передати те, що є вашим наміром, і це чогось варте.

Якщо ви використовуєте крихітний відтінок, не очевидно, що єдині значення, які ви повинні бачити, - це 0 і 1. Булевим ЗАВЖДИ є вірним або хибним.


35

booleanне є окремим типом даних в MySQL; це просто синонім для tinyint. Дивіться цю сторінку в посібнику MySQL .

Особисто я б запропонував використовувати tinyint як перевагу, тому що булевий не робить те, що, на вашу думку, робить із назви, тому це робить потенційно оманливим код. Але на практичному рівні це насправді не має значення - вони обидва роблять те саме, тож ви нічого не отримуєте і не втрачаєте, використовуючи будь-яке.


8

використовувати enum його найпростіше і швидко

я не рекомендую enum чи tinyint (1), оскільки біту (1) потрібно лише 1 біт для зберігання булевого значення, тоді як tinyint (1) потребує 8 біт.

реф

TINYINT vs ENUM (0, 1) для булевих значень у MySQL


Ми не можемо використовувати перерахування , як наша база даних також повинна підтримувати SQLite
Томь

11
Якщо ви використовуєте InnoDB, біт закінчується, використовуючи стільки ж місця, скільки tinyint. Із високоефективного MySQL (хлопці з Percona) "InnoDB зберігає [s] кожен [бітовий] стовпець як найменший цілочисельний тип, достатньо великий, щоб містити біти, тому ви не економите жодного місця для зберігання." Єдине посилення - якщо ви зберігаєте кілька булевих значень у стовпці BIT (morethan1). Отже, якщо у вас є лише одне булеве поле, використання tinyint - це те саме, що і біт в InnoDB, і є кращим, оскільки з tinyint зазвичай простіше працювати.
billmalarky

Не вірно для MySQL: BIT(M) - approximately (M+7)/8 bytesдив.: Dev.mysql.com/doc/refman/8.0/uk/storage-requirements.html
Jens

6

Хоча це правда , що boolі tinyint(1)є функціонально ідентичними, boolповинна бути кращим варіантом , оскільки він несе в собі смислове значення , що ви намагаєтеся зробити. Крім того, багато ORM перетворять boolна рідний буловий тип вашої мови програмування.


0

Мій досвід використання Dapper для підключення до MySQL такий це має значення . Я змінив нульовий біт (1) на мінливий tinyint (1), використовуючи наступний сценарій:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Тоді Даппер почав кидати винятки. Я намагався подивитися на різницю до і після сценарію. І помітив, що біт (1) змінився на крихітний (1).

Я тоді побіг:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Що вирішило проблему.

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