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

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

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

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

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

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


当前回答

参考此链接 Mysql中的布尔数据类型,根据应用程序的使用情况,如果只存储0或1,比特(1)是更好的选择。

其他回答

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

从MySQL文档:

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

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

some_flag CHAR(0) DEFAULT NULL

如果要将其设置为true,则设置some_flag = ",如果要将其设置为false,则设置some_flag = NULL。

然后测试是否为真,检查some_flag是否为非空,测试是否为假,检查some_flag是否为空。

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

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

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

我厌倦了试图得到零,null,和“准确地循环PHP, MySql和POST值,所以我只是使用'是'和'No'。

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

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