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

car*_*ier 100 mysql bit tinyint

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

Rob*_*ble 116

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

  • TINYINT可以是有符号或无符号的,与负数有关.Bit只是存储位而不签名数据,您可以自己解释MSB. (13认同)
  • TINYINT和BIT(8)之间有什么区别? (7认同)
  • 为了避免混淆,应该补充说TINYINT和BIT(1)的[存储要求](https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html)没有区别BOOL和BOOLEAN是TINYINT(1)[Numeric Type Overview](https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html)的同义词. (4认同)

Nel*_*nda 57

数值类型概述 ;

BIT [(M)]

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

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

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

一个非常小的整数.有符号范围是-128到127.无符号范围是0到255.

另外考虑一下;

BOOL,BOOLEAN

这些类型是TINYINT(1)的同义词.值为零被视为false.非零值被认为是真实的.

  • 你是说`boolean`会占用一个字节,即使它真的只是一点,所以在v5.0.3之后BIT(1)会更好吗? (11认同)
  • 就实际存储而言,BIT(1)仍然占用最少一个字节.BIT(M)=(M + 7)/ 8字节.(1 + 7)/ 8 = 1个字节.请参见[数字类型存储要求](https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric). (6认同)
  • 遗憾的是`BOOL`/`BOOLEAN` 是`TINYINT(1)` 而不是`BIT` 的别名。当然,它们最终都会占用一个完整的字节,但从语义上来说,“BIT”会更合适。 (4认同)
  • 是的@Pacerier.Boolean只是数字字段的丑陋别名. (3认同)

She*_*ndu 36

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


Mic*_*sen 11

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

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

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


All*_*rdy 6

可能是错的,但是:

Tinyint 是 0 到 255 之间的整数

位是 1 或 0

因此对我来说 bit 是布尔值的选择