布尔值与tinyint(1)在MySQL中的布尔值


124

哪种列类型最适合在MySQL数据库中使用布尔值?我用,boolean但我的同事用tinyint(1)


3
看来,MySQL的透明对待booleantinyint(1)。所以,你可以使用booleantrue并且false和MySQL将它们视为tinyint(1)10
ADTC

另一种情况是具有Y&N的char 1,这在某些人看来应该更快。
Zon

Answers:


153

这些数据类型是同义词。


6
我不会说数据类型是同义词-tinyint(1)与bool相同,但是tinyint和bool不同。轻微的问题,但是您的答案让我第一次阅读时就感到
震惊

2
这不能回答问题。尽管tinyint(1)在功能上确实与bool相同,但是OP询问了最佳使用方法。@dj_segfault的回答做了正确的工作,解释了为什么在存储布尔值时,布尔应该比tinyint(1)更受青睐。
凯尔·摩根

87

在这里,我将采用另一种方法,建议对于您的开发人员来说,理解您的代码与编译器/数据库一样重要。使用布尔值可能与使用tinyint相同,但是它具有在语义上传达您的意图的优点,这是值得的。

如果使用tinyint,则应该看到的唯一值不是0和1并不明显。布尔值始终为true或false。


35

boolean在MySQL中不是不同的数据类型;它只是的同义词tinyint请参阅MySQL手册中的此页面

我个人建议使用tinyint作为首选项,因为boolean不会按照名称进行操作,因此可能导致误导代码。但是从实际的角度来看,这实际上并不重要-它们两者都做相同的事情,因此您不会因为使用这两者而获得或失去任何东西。


8

使用枚举既简单又快捷

我不建议使用enum或tinyint(1),因为bit(1)仅需要1位用于存储布尔值,而tinyint(1)需要8位。

参考

TINYINT与ENUM(0,1)在MySQL中的布尔值


我们无法使用枚举,因为我们的数据库还需要支持sqlite
tom 2010年

11
如果您使用的是InnoDB,则位最终会占用与tinyint一样多的空间。来自高性能MySQL(percona专家)的文章“ InnoDB将每个[bit]列存储为最小的整数类型,该类型足以容纳这些位,因此您不会节省任何存储空间。” 唯一的好处是,如果您要在BIT(morethan1)列中存储多个布尔值。因此,如果您只有一个布尔字段,则使用tinyint与InnoDB中的bit相同,这是首选方法,因为tinyint通常更易于使用。
billmalarky

对于MySQL不正确:BIT(M) - approximately (M+7)/8 bytes请参见:dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

虽然这是真的,bool并且tinyint(1)在功能上是相同的,bool应该是更好的选择,因为它承载着你想要做什么语义。同样,许多ORM都将转换bool为编程语言的本机布尔类型。


0

使用时,我的经验小巧玲珑连接到MySQL的是,这非常重要。我使用以下脚本将不可为空的bit(1)更改为可为空的tinyint(1):

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

然后Dapper开始抛出异常。我试图看一下脚本前后的区别。并注意到bit(1)已更改为tinyint(1)。

然后我跑了:

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

解决了问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.