2010-09-20 136 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转换为您的编程语言的本机布尔类型。