2010-09-20 106 views
80

在MySQL數據庫中最適合使用哪種列類型的布爾值?我使用boolean,但我的同事使用tinyint(1)布爾值與tinyint(1)在MySQL中的布爾值

+0

似乎MySQL透明地將'boolean'視爲'tinyint(1)'。所以你可以使用'boolean','true'和'false',MySQL將它們視爲'tinyint(1)','1'和'0'。 – ADTC 2016-11-05 07:26:56

+0

另一個案例是字符1與Y&N,這應該是由一些人更快。 – Zon 2017-06-23 05:14:43

回答

99

這些數據類型是同義詞。

+15

是的 - http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html – 2010-09-20 13:27:05

+0

我不會說數據_types_是同義詞 - tinyint(1)是相同的布爾,但tinyint和bool不一樣。小點,但你的回答絆倒了我第一次閱讀它 – 2017-10-06 19:57:52

+0

這並沒有回答這個問題。雖然tinyint(1)在功能上與bool完全相同,但操作系統詢問最佳使用方法。 @dj_segfault的答案做了一個適當的工作,解釋爲什麼在存儲布爾值時,bool應該優於tinyint(1)。 – 2017-11-21 02:05:04

27

boolean在MySQL中不是一個獨特的數據類型;它只是tinyint的同義詞。 See this page in the MySQL manual

就我個人而言,我會建議使用tinyint作爲首選項,因爲布爾值不會做你認爲它從名稱中做的事情,所以它會導致潛在的誤導性代碼。但是在實踐層面上,這並不重要 - 它們都做同樣的事情,所以你不會因爲使用任何東西而獲得或失去任何東西。

6

使用枚舉其容易和最快

我不會推薦枚舉或TINYINT(1),比特(1)只需要1個用於存儲布爾值而TINYINT(1)需要8位位。

裁判

TINYINT vs ENUM(0, 1) for boolean values in MySQL

+0

我們不能使用枚舉,因爲我們的數據庫也需要支持sqlite – tom 2010-09-20 13:32:53

+6

如果您使用的是InnoDB,那麼最終的結果就是使用tinyint的空間。來自[高性能MySQL](http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/1449314287/)(percona球員)「InnoDB存儲每個[位]列作爲最小的整數類型足以容納這些位,因此您不需要保存任何存儲空間。「唯一的好處就是如果你將多個布爾值存儲在BIT(morethan1)列中。因此,如果只有一個布爾字段,那麼使用tinyint與InnoDB中的位相同,因爲tinyint通常更易於使用,所以更好。 – billmalarky 2013-04-16 18:59:44

60

,我要在這裏採取不同的方法和建議,爲您的夥伴開發人員理解你的代碼,因爲它是編譯器/數據庫,它只是作爲重要的。使用布爾值可以做與使用tinyint相同的功能,但它具有語義上表達您的意圖的優點,這是值得的。

如果你使用tinyint,你應該看到的唯一值是0和1並不明顯。布爾值總是爲真或爲假。

0

我的經驗用小巧玲瓏連接到MySQL的這件事一樣。我換了一個非可空位(1)爲可空TINYINT(1)通過使用下面的腳本:

ALTER TABLE TableName MODIFY Setting BOOLEAN null; 

然後小巧玲瓏開始拋出異常。我試圖看看腳本前後的區別。並注意到位(1)已變成tinyint(1)。

我然後跑:

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

這解決了這個問題。

1

雖然這是事實,booltinyint(1)功能相同,bool應該是更好的選擇,因爲它承載着你想要做什麼語義。此外,許多ORM會將bool轉換爲您的編程語言的本機布爾類型。