用于存储布尔值的mysql数据类型

Which MySQL data type to use for storing boolean values

因为MySQL似乎没有任何"布尔"数据类型,所以您"滥用"哪种数据类型来存储MySQL中的真/假信息?

尤其是在编写和读取PHP脚本的上下文中。

随着时间的推移,我使用并看到了几种方法:

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

以上都不是最佳选择。我倾向于使用tinyint 0/1变量,因为PHP中的自动类型转换提供的布尔值非常简单。

那么您使用哪种数据类型呢?是否有一个类型是为我忽略的布尔值设计的?您是否看到使用一种或另一种类型有什么优点/缺点?


对于MySQL5.0.3及更高版本,可以使用BIT。手册上说:

As of MySQL 5.0.3, the BIT data type is used to store bit-field
values. A type of BIT(M) enables storage of M-bit values. M can range
from 1 to 64.

否则,根据mysql手册,您可以使用bool和boolean,这是tinyint(1)的别名:

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

MySQL还指出:

We intend to implement full boolean
type handling, in accordance with
standard SQL, in a future MySQL
release.

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


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


这是一个优雅的解决方案,我非常感谢,因为它使用零数据字节:

1
some_flag CHAR(0) DEFAULT NULL

设置为真,设置some_flag = '',设置为假,设置some_flag = NULL

然后,为了测试是否正确,检查是否有IS NOT NULL标志,为了测试是否错误,检查是否有IS NULL标志。

(此方法由Jon Warren Lentz、Baron Schwartz和Arjen Lentz在"高性能MySQL:优化、备份、复制等"中介绍。)


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

来自MySQL文档

CHAR(0) is also quite nice when you need a column that can take only
two values: A column that is defined as CHAR(0) NULL occupies only one
bit and can take only the values NULL and '' (the empty string).


如果使用布尔类型,则其别名为tinyint(1)。如果您希望使用标准化的SQL,并且不介意字段可能包含超出范围的值(基本上,任何非0的值都将是"true"),那么这是最好的方法。

枚举("false"、"true")将允许您使用SQL中的字符串,MySQL将在内部将字段存储为一个整数,其中"false"=0和"true"=1基于指定枚举的顺序。

在MySQL5+中,可以使用位(1)字段来表示1位数字类型。我不相信这实际上会占用存储空间,但再次允许您将可能的值限制为1或0。

所有这些都将使用大致相同的存储量,因此最好选择最容易使用的存储量。


我使用tinyint(1)在mysql中存储布尔值。

我不知道用这个有什么好处…但如果我没有错的话,MySQL可以存储布尔值(bool),并将其存储为tinyint(1)

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


如果您有很多布尔字段,那么bit只对各种字节选项(tinyint、enum、char(1))有利。一个位字段仍占满字节。两个位字段适合同一个字节。三,四,五,六,七,八。然后开始填充下一个字节。最终,节省的成本是如此之小,您应该关注成千上万的其他优化。除非处理大量数据,否则这几个字节加起来不会太多。如果在PHP中使用bit,则需要输入和输出值。


在mysql实现一个位数据类型之前,如果您的处理真正需要空间和/或时间,例如处理大量事务,那么为所有布尔变量创建一个名为bit_flags的tinyint字段,并屏蔽和移动SQL查询中需要的布尔位。

例如,如果最左边的位代表您的bool字段,最右边的7位不代表任何内容,那么您的bit_flags字段将等于128(二进制10000000)。屏蔽(隐藏)七个最右边的位(使用按位运算符&),并将第8位的七个空格右移,最后得到00000001。现在,整个数字(在本例中是1)就是您的值。

1
2
3
4
SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

您可以在测试时运行这样的语句

1
2
3
SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

等。

因为您有8位,所以一个字节中可能有8个布尔变量。一些未来的程序员总是使用接下来的7位,所以您必须屏蔽。不要只是改变,否则将来你会为自己和他人创造地狱。确保你让MySQL做你的屏蔽和转移——这将比让Web脚本语言(PHP、ASP等)做的要快得多。另外,请确保在mysql comment字段中为您的bit_flags字段放置注释。

在实现此方法时,您会发现这些站点很有用:

  • mysql-位函数和运算符
  • 十进制/二进制转换工具


我受够了试图得到零、空值和""精确地循环php、mysql和post值,所以我只使用"yes"和"no"。

这项工作完美无瑕,不需要任何不明显和不容易做到的特殊治疗。