boolean - MySQL 存储布尔值选择哪种数据类型?

  显示原文与译文双语对照的内容

因为MySQL似乎没有任何'布尔型'数据类型,所以'滥用'在MySQL中存储真假信息的数据类型是什么? 尤其是在从/到PHP-Script的书写和读取的上下文中。

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

  • tinyint,varchar字段包含值 0/1.
  • 包含字符串'0'/'1'或者'真'/'false'的varchar字段'
  • 最后包含两个选项'真'/'错误'的枚举字段。

以上似乎最优,我更倾向于非常小的整数 0/1 变体,从自动类型转换在php中给我布尔值,而简单。

那么你使用的是哪种数据类型,是否有一个类型为我忽略的布尔值而设计? 通过使用一种类型或者另一种类型,你有什么优点/缺点?

时间:

对于 MySQL 5.0.3和更高版本,你可以使用 BIT 。 手册上写着:

在 MySQL 5.0.3中,位数据类型用于存储bit-field值。 BIT(M) 类型允许存储M-bit值。 M 范围从 1到 64.

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

布尔型,布尔型:这些类型是 TINYINT(1)的同义词。 值为零的值被认为是假的。 Non-zero值被认为是真的。

MySQL还声明:

我们打算在未来的MySQL发行版中实现完全的布尔类型处理,按照标准的SQL 。

顺便说一句:这只是 http://www.google.ch/search?q=mysql+boolean+datatype的一个问题。

有趣的是,这个链接已经过了几年了,已经变成了递归。

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

这是一个优雅的解决方案,我非常欣赏它,因为它使用了零数据字段:


some_flag CHAR(0) DEFAULT NULL

设置为真,设置 some_flag ='' 并设置为 false,设置 some_flag = NULL

然后测试是否正确,检查 some_flag IS NOT NULL,并检查是否有错误,检查 some_flag IS NULL

( 这里方法在"高性能 MySQL"中描述: 优化,备份,复制,以及更多"由 Jon Warren Lentz,男爵Schwartz和 Arjen Lentz 。

[edit] 我刚刚意识到已经发布了一个 -2投票答案,并且有相同的解决方案。 我将删除这里选项,但看不到要执行的操作。 我也不同意 down-votes,因为我觉得它是一个很好的解决方案。

这个问题已经回答了,但我想我将抛出我的$0.02. 我经常使用 CHAR(0),,其中''==真和空==假。

来自 MySQL文档 web

当你需要一个只需要两个值的列时,CHAR(0) 也非常不错: 定义为 CHAR(0) 空的列只占用一个位,并且只能取空值和''( 空字符串) 。

如果你使用布尔类型,这将被别名为 TINYINT(1) 。 如果你想使用标准化 SQL,而不介意该字段包含超出范围值( 任何不是 0的东西都是'真'),这是最好的。

ENUM('False','True') 会让你使用在你的sql字符串,和mysql将字段内部存储为整数'错误'=0和'真'=1基于enum的顺序指定。

在mysql 5+你可以使用 BIT(1) 字段指示 1 -bit数值类型。 我不相信这个实际使用中的任何更少的空间存储但同样可以约束 1或者 0的可能值。

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

我使用 TINYINT(1) 来在MySQL中存储布尔值。

我不知道使用这个有什么好处。。 但如果我没有错,MySQL可以存储布尔( BOOL ) 并将它的存储为 tinyint(1 )

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

位只在不同的字节选项( 如 char(1)),enum,如果你有很多布尔字段) 。 位域仍占满字节。 两个位字段符合同一个字节。 三,四,五,六,七,八。 然后他们开始填充下一个字节。 最终节省的是如此小,你应该关注成千上万的其他优化。 除非你在处理大量的数据,否则这些字节不会增加很多。 如果你使用的是 PHP,你需要对输入和输出的值进行调整。

直到mysql实现了一个数据类型,如果你处理是真正的空间和/或时间要求,例如高容量事务,创建一个名为bit_flags的非常小的整数字段,为所有你的布尔变量,和面具,把布尔你欲望的sql查询。

例如如果你的left-most位代表了你的bool字段,而 7个最右边的位表示什么,那么你的bit_flags字段将等于 128 ( 二进制 10000000 ) 。 掩码( 隐藏) 最右边的位( 使用按位运算符 & ),将 8位的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)

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


SELECT (128 & 128)>> 7;

SELECT (0 & 128)>> 7;

等等 。

由于有 8位,你可能有 8个布尔变量,从一个字节。 未来的一些程序员将总是使用接下来的七位,所以你必须屏蔽。 不要只是移动,否则将来你会为自己和其他人创建地狱。 Make sure you have a MySQL do your masking and shifting - will be significantly faster - than having web-scripting language ( PHP,ASP等。) do it. 同时确保你在bit_flags字段的注释字段中放置注释。

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

我只知道这会带来一个downvotes的记录数,但是我已经厌倦了在一个 PHP,MySQL和POST值循环中精确地获取零,空和''。 完美的工作,不需要任何不明显的特殊处理。

参考这里链接 中的布尔数据类型,根据应用程序使用情况,如果只需要存储 0或者 1,bit(1) 是更好的选择。

...