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

What is the difference between BIT and TINYINT in MySQL?

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


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


从数值类型概述;

BIT [(M)]

A bit-field type. M indicates the
number of bits per value, from 1 to
64. The default is 1 if M is omitted.

This data type was added in MySQL
5.0.3 for MyISAM, and extended in 5.0.5 to MEMORY, InnoDB, BDB, and NDBCLUSTER. Before 5.0.3, BIT is a
synonym for TINYINT(1).

TINYINT [(M)] [未签名] [ZEROFILL]

A very small integer. The signed range
is -128 to 127. The unsigned range is
0 to 255.

另外考虑一下;

BOOL,BOOLEAN

These types are synonyms for
TINYINT(1). A value of zero is
considered false. Non-zero values are
considered true.


所有这些理论讨论都很棒,但实际上,至少如果你正在使用MySQL而且真的是用于SQLServer,最好坚持使用非二进制数据为你的布尔值,原因很简单,当你使用它时更容易使用'输出数据,查询等。如果您正在尝试实现MySQL和SQLServer之间的互操作性(即您在两者之间同步数据),这一点尤其重要,因为BIT数据类型的处理在两者中是不同的。因此,如果你坚持使用数值数据类型,那么在实践中你将会有更少的麻烦。我建议MySQL坚持BOOL或BOOLEAN,它存储为TINYINT(1)。即使MySQL Workbench和MySQL Administrator显示BIT数据类型的方式也不好(它是二进制数据的一个小符号)。所以要务实并省去自己的麻烦(不幸的是,我是从经验中说出来的)。


BIT应该只允许0和1(如果字段未定义为NOT NULL,则为NULL)。 TINYINT(1)允许任何可以存储在单个字节中的值,-128..127或0..255,具体取决于它是否为无符号(1表示您只打算使用单个数字,但它确实不要阻止你存储更大的值)。

对于早于5.0.3的版本,BIT被解释为TINYINT(1),因此没有区别。

BIT有一个"这是一个布尔"的语义,有些应用程序会以同样的方式考虑TINYINT(1)(由于MySQL使用它的方式),所以如果他们检查类型,应用程序可能会将列格式化为复选框并根据该格式决定格式。


可能是错的但是:

Tinyint是0到255之间的整数

位是1或0

所以对我来说有点是布尔人的选择


根据我的经验,我告诉你BIT在linux操作系统类型上存在问题(Ubuntu for ex)。
我在Windows上开发了我的数据库,在我在linux上部署了所有内容之后,我遇到了从具有BIT DATA TYPE的表中插入或选择的查询的问题。

比特现在不安全。
我改成了tinyint(1)并且工作得很好。我的意思是你只需要一个值来区分它是不是1或0而tinyint(1)就可以了