MySQL中的BIT和TINYINT有什么区别?


106

在哪种情况下,您会使用哪种?有什么区别吗?持久性引擎通常使用哪一个来存储布尔值?

Answers:


122

TINYINT是8位整数值,BIT字段可以存储1位BIT(1)和64位BIT(64)之间。对于布尔值,BIT(1)很常见。


10
TINYINT和BIT(8)有什么区别?
Pacerier,2011年

16
TINYINT可以是带符号的也可以是无符号的,并且与负数有关。位只存储位而不签名数据,您可以自己解释MSB。
定义

4
为避免混淆,应添加TINYINT和BIT(1)的存储要求没有区别,并且BOOL和BOOLEAN是TINYINT(1)数值类型概述的同义词。
Timo Strotmann

59

数值类型概述 ;

BIT [(M)]

位字段类型。M表示每个值的位数,从1到64。如果省略M,则默认值为1。

在MyISAM的MySQL 5.0.3中添加了此数据类型,并在5.0.5中将其扩展到了MEMORY,InnoDB,BDB和NDBCLUSTER。在5.0.3之前,BIT是TINYINT(1)的同义词。

TINYINT [(M)] [未签名] [零填充]

一个非常小的整数。有符号范围是-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个字节。请参阅数字类型存储要求
Drazen Bjelovuk

1
遗憾的是BOOL/ BOOLEAN是的别名,TINYINT(1)而不是BIT。当然,它们最终都占据了整个字节,但是从语义上讲BIT会更合适。
MestreLion

38

所有这些理论讨论都很棒,但实际上,至少,如果您同时使用MySQL和SQL Server,则最好为布尔值坚持使用非二进制数据,原因很简单,当您使用布尔值时正在输出数据,查询等等。如果要实现MySQL和SQLServer之间的互操作性(即在两者之间同步数据),则尤其重要,因为BIT数据类型的处理在两者中是不同的。所以在实践中,如果坚持使用数字数据类型,那么麻烦就少得多。我建议MySQL坚持使用BOOL或BOOLEAN,它们将存储为TINYINT(1)。甚至MySQL Workbench和MySQL Administrator显示BIT数据类型的方式也不是很好(二进制数据有点符号)。


1
在我看来,某些接口等确实错误地解释了正确的二进制数据不是我的错。如果管理员(包括我自己)抱怨某个符号(指MySQL Wrokbench),则这是谁将我的正确(二进制)数据误解为没有提供内容信息的符号的问题。因此MySQL / Oracle犯了错误,我不愿意仅仅因为有人犯了错误而改变我的编程概念。
Matmarbon 2015年

11

BIT仅应允许0和1(如果字段未定义为NOT NULL,则为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 OS类型(Ubuntu for ex)上有问题。我在Windows上开发了数据库,并在Linux上部署了所有程序之后,在从具有BIT DATA TYPE的表中插入或选择查询时遇到了问题。

位暂时不安全。我改用tinyint(1)并正常工作。我的意思是,如果它是1或0,并且只需要tinyint(1)就可以了

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.