哪个MySQL数据types用于存储布尔值

由于MySQL似乎没有任何“布尔”数据types,您在MySQL中存储真/假信息的“滥用”哪种数据types?

特别是在编写和读取PHP脚本的情况下。

随着时间的推移,我已经使用了几种方法:

  • tinyint,包含值0/1的varchar字段,
  • 包含string'0'/'1'或'true'/'false'的varchar字段
  • 最后枚举包含两个选项'true'/'false'的字段。

以上都不是最佳的。 我倾向于使用tinyint 0/1变体,因为PHP中的自动types转换给了我更简单的布尔值。

那么你使用哪种数据types? 有没有为我忽略的布尔值devise的types? 你是否看到使用这种或那种types的优点/缺点?

对于MySQL 5.0.3及更高版本,您可以使用BIT 。 手册说:

从MySQL 5.0.3开始,BIT数据types用于存储位域值。 一种BIT(M)能够存储M位值。 M可以从1到64。

否则,根据MySQL手册,你可以使用bint和boolean,它们是tinyint (1)的别名:

Bool,Boolean:这些types是TINYINT (1)的同义词。 值为零被认为是错误的。 非零值被认为是正确的。

MySQL还指出:

我们打算在未来的MySQL版本中,按照标准的SQL实现完整的布尔types处理。

参考文献: http : //dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

顺便说一句:这只是https://google.com/search?q=mysql+boolean+datatype的问题; 。

有趣的是,这个链接,几年前发布,已经成为recursion。

BOOLBOOLEANTINYINT(1)同义词。 零是false ,其他的都是true 。 更多信息在这里 。

这是一个优雅的解决scheme,我很欣赏,因为它使用零数据字节:

 some_flag CHAR(0) DEFAULT NULL 

要将其设置为true,请设置some_flag = ''并将其设置为false,请设置some_flag = NULL

然后为了testingtrue,检查some_flag是否为IS NOT NULL ,并且为了testingfalse,检查some_flag是否为IS NULL

(这种方法在Jon Warren Lentz,Baron Schwartz和Arjen Lentz的“高性能MySQL:优化,备份,复制和更多”中有描述。

这个问题已经回答了,但我想我会扔我的0.02美元。 我经常使用CHAR(0),其中'== == true和NULL == false。

从MySQL文档

当需要一个只能取两个值的列时,CHAR(0)也相当不错:定义为CHAR(0)NULL的列只占用一个位,只能取NULL和''(空string) 。

如果使用BOOLEANtypes,则将其别名为TINYINT(1)。 这是最好的,如果你想使用标准化的SQL,并不介意该字段可能包含超出范围的值(基本上任何不是0将是'真正的')。

ENUM('False','True')可以让你在你的SQL中使用这个string,并且MySQL会根据指定Enum的顺序在内部以'False'= 0和'True'= 1的整数。

在MySQL 5 +中,您可以使用BIT(1)字段来指示1位数字types。 我不相信这实际上在存储空间中使用的空间更less,但是也可以将可能的值限制为1或0。

以上所有将使用大致相同数量的存储,所以最好select一个你觉得最容易使用的存储。

我使用TINYINT(1)为了在Mysql中存储布尔值。

我不知道是否有任何优势使用这个…但是,如果我没有错,mysql可以存储布尔(布尔),它存储为一个tinyint(1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html

如果你有很多的布尔字段,那么比起各种字节选项(tinyint,enum,char(1)),它只有一个优点。 一个字段仍然占用一个完整的字节。 两位字段适合相同的字节。 三,四,五,六,七,八。 之后他们开始填充下一个字节。 最终的节省是如此之小,还有其他数千个你应该关注的优化。 除非你处理大量的数据,否则这几个字节不会太多。 如果您使用PHP,您需要对input和输出的值进行types转换。

在MySQL实现一个数据types之前,如果你正在处理的是真正的空间和/或时间,比如大量的事务处理,为你所有的布尔variables创build一个名为bit_flags的TINYINT字段,并且屏蔽和移动布尔值渴望在你的SQL查询中。

例如,如果最左边的位表示您的布尔字段,并且最右边的7位不表示任何内容,那么您的bit_flags字段将等于128(二进制10000000)。 屏蔽(隐藏)最右边的7位(使用按位运算符&),并将第8位向右移动7位,结束于00000001.现在,整个数字(在本例中为1)就是您的值。

 SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t; if bit_flags = 128 ==> 1 (true) if bit_flags = 0 ==> 0 (false) 

您可以在testing时运行这些语句

 SELECT (128 & 128) >> 7; SELECT (0 & 128) >> 7; 

等等…

既然你有8位,你可能有8个布尔variables,从一个字节。 一些未来的程序员总是会使用接下来的七位,所以你必须掩饰。 不要只是转移,否则你将在未来为自己和他人创造地狱。 确保你有MySQL做你的掩饰和转移 – 将比使用networking脚本语言(PHP,ASP等)做得更快。 还要确保你在你的bit_flags字段的MySQL注释字段中放置一个注释。

实现此方法时,您会发现这些网站很有用。 http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html

我厌倦了试图得到零,NULLS和“准确地围绕PHP,MySql和POST值的循环,所以我只是使用”是“和”否“。

这工作完美无瑕,不需要特别的处理,不明显,容易做到。

参考Mysql中的这个链接布尔数据types ,根据应用的用途,如果只需要存储0或1,则位(1)是更好的select。