因为MySQL似乎没有任何“布尔”数据类型,你'滥用'哪种数据类型存储真/假的信息在MySQL?
特别是在编写和读取PHP脚本的上下文中。
随着时间的推移,我使用并看到了几种方法:
Tinyint, varchar字段包含0/1,
Varchar字段包含字符串'0'/'1'或'true'/'false'
最后枚举包含“true”/“false”两个选项的字段。
以上这些似乎都不是最佳选择。我倾向于选择tinyint 0/1变体,因为PHP中的自动类型转换相当简单地为我提供布尔值。
那么使用哪种数据类型呢?是否有我忽略的布尔值的类型设计?你认为使用一种或另一种类型有什么优点或缺点吗?
在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字段添加了注释。
在实现这个方法时,你会发现这些站点很有用:
位函数和操作符
十进制/二进制转换工具
这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:
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:优化,备份,复制和更多”中有描述。)