由于MySQL似乎没有任何“布尔”数据类型,您在“滥用”哪种数据类型来存储MySQL中的真/假信息?
特别是在写入和读取PHP脚本的上下文中 .
随着时间的推移,我使用并看到了几种方法:
-
tinyint,包含值0/1的varchar字段,
-
varchar字段包含字符串'0' / '1'或'true' / 'false'
-
并最终枚举包含两个选项'true' / 'false'的字段 .
以上都不是最佳选择 . 我更倾向于使用tinyint 0/1变体,因为PHP中的自动类型转换非常简单地给出了布尔值 .
那你使用哪种数据类型?有没有为布尔值设计的类型我忽略了?您是否看到使用某种类型的优点/缺点?
11 回答
这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:
要将其设置为true,请设置
some_flag = ''
并将其设置为false,设置some_flag = NULL
.然后测试是否为true,检查some_flag
IS NOT NULL
,并测试为false,检查是否some_flagIS NULL
.(这种方法在Jon Warren Lentz,Baron Schwartz和Arjen Lentz的“High Performance MySQL:Optimization,Backups,Replication,and More”中有所描述 . )
参考此链接Boolean datatype in Mysql,根据应用程序的用法,如果只想存储0或1,则位(1)是更好的选择 .
BOOL
和BOOLEAN
是TINYINT(1)
的同义词 . 零是false
,其他任何东西都是true
. 更多信息here .如果使用BOOLEAN类型,则将其别名为TINYINT(1) . 如果你想使用标准化的SQL并且不介意该字段可能包含超出范围的值(基本上任何非0的都是'true'),这是最好的 .
ENUM('False','True')将允许您在SQL中使用字符串,并且MySQL将在内部将字段存储为整数,其中'False'= 0并且'True'= 1,基于指定Enum的顺序 .
在MySQL 5中,您可以使用BIT(1)字段来指示1位数字类型 . 我不相信这实际上在存储中使用了更少的空间,但是再次允许您将可能的值约束为1或0 .
以上所有内容都将使用大致相同的存储空间,因此最好选择最容易使用的存储空间 .
这个问题已得到解答,但我想我会投入0.02美元 . 我经常使用CHAR(0),其中''== true和NULL == false .
从mysql docs
在MySQL实现位数据类型之前,如果您的处理是真正按空间和/或时间的,例如使用高容量事务,请为所有布尔变量创建一个名为
bit_flags
的TINYINT字段,并屏蔽并移动您想要的布尔位SQL查询 .例如,如果你的最左边的位代表你的bool字段,而最右边的7位代表什么,那么你的
bit_flags
字段将等于128(二进制10000000) . 掩盖(隐藏)最右边的七个位(使用按位运算符&
),并将第8位向右移动七个空格,最后以00000001结束 . 现在整个数字(在本例中为1)是您的值 .您可以在测试时运行这些语句
等等
由于您有8位,因此一个字节可能有8个布尔变量 . 一些未来的程序员将总是使用接下来的七位,所以你必须掩盖 . 不要只是转移,否则你将来会为自己和他人创造地狱 . 确保你有MySQL进行屏蔽和转移 - 这比使用网络脚本语言(PHP,ASP等)做得快得多 . 另外,请确保在
bit_flags
字段的MySQL注释字段中添加注释 .在实现此方法时,您会发现这些网站很有用:
MySQL — Bit Functions and Operators
Decimal/Binary Conversion Tool
我厌倦了尝试获得零,NULLS,并且''准确地围绕PHP,MySql和POST值循环,所以我只使用'是'和'否' .
这种方法完美无缺,不需要特别的处理,这种处理不明显且容易做到 .
我使用TINYINT(1)来在Mysql中存储布尔值 .
我不知道使用这个是否有任何优势...但如果我没有错,mysql可以存储boolean(BOOL)并将其存储为tinyint(1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
对于MySQL 5.0.3及更高版本,您可以使用
BIT
. 手册说:否则,根据MySQL手册,您可以使用bool和boolean,它们是tinyint(1)的别名:
MySQL还声明:
参考文献:http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
如果你有很多布尔字段,Bit只比各种字节选项(tinyint,enum,char(1))更有优势 . 一位字段仍占用一个完整字节 . 两个位字段适 Contract 一个字节 . 三,四,五,六,七,八 . 之后他们开始填写下一个字节 . 最终节省的成本非常小,您应该关注数以千计的其他优化 . 除非您处理大量数据,否则这几个字节不会增加太多 . 如果您在PHP中使用bit,则需要对输入和输出的值进行类型转换 .
在这里阅读了答案后,我决定使用
bit(1)
,是的,它在空间/时间方面有所改善,过了一段时间我改变了主意,我再也不会使用它了 . 当使用预处理语句,库等(php)时,它使我的开发变得很复杂 .从那时起,我总是使用
tinyint(1)
,似乎已经足够了 .