TINYINT vs ENUM(0,1)表示MySQL中的布尔值

时间:2010-08-23 09:19:32

标签: php mysql enums tinyint

哪一个更好,Tinyint在MyISAM表和MySQL 5.1中有0和1值或ENUM 0,1?

5 个答案:

答案 0 :(得分:25)

您可以使用mysql 5.1 reference中提到的BIT(1)。我不会推荐enumtinyint(1) 因为bit(1)只需要1位用于存储布尔值,而tinyint(1)需要8位。

答案 1 :(得分:4)

我的研究表明,对于5.0.3之前的MySQL版本,BIT(1)是TINYINT(1)的同义词。

5.0.3之后的MySQL版本改变了BIT数据类型的工作方式。它不再是TINYINT的同义词,并且是唯一允许您以少于一个字节存储任何内容的数据类型。

此数据类型可能更适合使用TINYINT或ENUM。我计划在我的博客上进行测试,以查看哪个最快,以及三者的空间使用情况。如果你想看到尺寸和速度的结果,底部有一个链接。 Testbed:运行OpenBSD和MySQL的消费级Pentium III盒子。 (使用较慢的DB开发框,您可以真正感受到错误代码的影响。此外,测试查询之间的差异更加明显。或者,尝试使用分配了足够资源的VM。)

MySQL官方文档。

Baron Schwartz对此有所说明。

  

http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/

答案 2 :(得分:1)

我建议ENUM更可取,因为它可以清楚地说明预期的结果;如果它以任何可衡量的方式降低性能,我会非常惊讶。要做一个tinyint,这项工作需要检查列的约束;目前没有任何MySQL存储引擎支持此功能。

答案 3 :(得分:1)

Enum在某种程度上为开发人员或程序员提供了“提示”。但通常情况下,以编程方式处理它会更好。 因此无论是ENUM(0,1),BIT(1)还是TINYINT(1),都使用1个字节,在大多数情况下,在客户端处理更好,而不是在位(1)中发送2或枚举(0,1)到服务器,然后服务器将返回一个你将不得不处理的错误 - 使用更多的资源(网络+服务器CPU +客户端CPU x 2)

0通常表示错误, 1是的。

答案 4 :(得分:0)

为获得最佳的性能和空间要求,应收集布尔值并将其保存在同一TINYINT中。例如。在TINYINT中最多保存8个布尔值。 SMALLINT等中的16个布尔值 BIT(1)和ENUM都使用至少1个字节094482018-07-10 022 14012 000 0 30000A 002290{ 059412018-07-10 022 14013 000 0 30000A 002290{ 015172018-07-10 046 17502 000 0 30000A 001699I 015172018-10-25 046 17502 000 0 30000A 001699I ,请参见:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html。因此,如果您要存储1个布尔值,那么我将使用TINYINT,因为它与BIT和ENUM的开销相同,但是如果需要,可以选择以后再存储7个布尔值。