因为MySQL似乎没有任何“布尔”数据类型,你'滥用'哪种数据类型存储真/假的信息在MySQL?

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

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

Tinyint, varchar字段包含0/1, Varchar字段包含字符串'0'/'1'或'true'/'false' 最后枚举包含“true”/“false”两个选项的字段。

以上这些似乎都不是最佳选择。我倾向于选择tinyint 0/1变体,因为PHP中的自动类型转换相当简单地为我提供布尔值。

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


当前回答

如果使用BOOLEAN类型,则别名为TINYINT(1)。如果你想使用标准化的SQL并且不介意字段可能包含一个超出范围的值(基本上任何不是0的都将是“true”),这是最好的。

ENUM('False', 'True')将允许您在SQL中使用字符串,MySQL将根据指定ENUM的顺序将字段内部存储为'False'=0和'True'=1的整数。

在MySQL 5+中,您可以使用BIT(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,则需要对进出的值进行类型转换。

这个问题已经得到了答案,但我想我要投入我的0.02美元。 我经常使用CHAR(0),其中“== true和NULL == false”。

从MySQL文档:

当您需要一个只能取的列时,CHAR(0)也是非常好的 两个值:定义为CHAR(0) NULL的列只占用一个值 位,只能取值NULL和"(空字符串)。

在MySQL实现位数据类型之前,如果您的处理确实受到空间和/或时间的压力,例如处理大量事务,则为所有布尔变量创建一个TINYINT字段bit_flags,并在SQL查询中屏蔽和移位您想要的布尔位。

例如,如果最左边的位代表bool字段,最右边的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)

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

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

etc.

因为你有8位,一个字节就有8个布尔变量。将来的程序员总是会使用后面的7位,所以你必须进行掩码。不要只是改变,否则你将在未来为自己和他人制造地狱。确保你用MySQL来做屏蔽和移动——这比用web脚本语言(PHP, ASP等)来做要快得多。另外,确保在MySQL注释字段中为bit_flags字段添加了注释。

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

位函数和操作符 十进制/二进制转换工具

在阅读了这里的答案后,我决定使用比特(1),是的,它在空间/时间上更好,但一段时间后我改变了主意,我再也不会使用它了。当使用准备好的语句、库等(php)时,它使我的开发变得非常复杂。

从那以后,我一直使用tinyint(1),似乎还不错。