首页 文章

用于存储布尔值的MySQL数据类型

提问于
浏览
1049

由于MySQL似乎没有任何“布尔”数据类型,您在“滥用”哪种数据类型来存储MySQL中的真/假信息?

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

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

  • tinyint,包含值0/1的varchar字段,

  • varchar字段包含字符串'0' / '1'或'true' / 'false'

  • 并最终枚举包含两个选项'true' / 'false'的字段 .

以上都不是最佳选择 . 我更倾向于使用tinyint 0/1变体,因为PHP中的自动类型转换非常简单地给出了布尔值 .

那你使用哪种数据类型?有没有为布尔值设计的类型我忽略了?您是否看到使用某种类型的优点/缺点?

11 回答

  • 5

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

    some_flag CHAR(0) DEFAULT NULL
    

    要将其设置为true,请设置 some_flag = '' 并将其设置为false,设置 some_flag = NULL .

    然后测试是否为true,检查some_flag IS NOT NULL ,并测试为false,检查是否some_flag IS NULL .

    (这种方法在Jon Warren Lentz,Baron Schwartz和Arjen Lentz的“High Performance MySQL:Optimization,Backups,Replication,and More”中有所描述 . )

  • 67

    参考此链接Boolean datatype in Mysql,根据应用程序的用法,如果只想存储0或1,则位(1)是更好的选择 .

  • 14

    BOOLBOOLEANTINYINT(1) 的同义词 . 零是 false ,其他任何东西都是 true . 更多信息here .

  • 12

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

    ENUM('False','True')将允许您在SQL中使用字符串,并且MySQL将在内部将字段存储为整数,其中'False'= 0并且'True'= 1,基于指定Enum的顺序 .

    在MySQL 5中,您可以使用BIT(1)字段来指示1位数字类型 . 我不相信这实际上在存储中使用了更少的空间,但是再次允许您将可能的值约束为1或0 .

    以上所有内容都将使用大致相同的存储空间,因此最好选择最容易使用的存储空间 .

  • 216

    这个问题已得到解答,但我想我会投入0.02美元 . 我经常使用CHAR(0),其中''== true和NULL == false .

    mysql docs

    当需要一个只能带两个值的列时,CHAR(0)也很好:定义为CHAR(0)的列只占用一位,只能取值NULL和''(空字符串) ) .

  • 17

    在MySQL实现位数据类型之前,如果您的处理是真正按空间和/或时间的,例如使用高容量事务,请为所有布尔变量创建一个名为 bit_flags 的TINYINT字段,并屏蔽并移动您想要的布尔位SQL查询 .

    例如,如果你的最左边的位代表你的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个布尔变量 . 一些未来的程序员将总是使用接下来的七位,所以你必须掩盖 . 不要只是转移,否则你将来会为自己和他人创造地狱 . 确保你有MySQL进行屏蔽和转移 - 这比使用网络脚本语言(PHP,ASP等)做得快得多 . 另外,请确保在 bit_flags 字段的MySQL注释字段中添加注释 .

    在实现此方法时,您会发现这些网站很有用:

  • 29

    我厌倦了尝试获得零,NULLS,并且''准确地围绕PHP,MySql和POST值循环,所以我只使用'是'和'否' .

    这种方法完美无缺,不需要特别的处理,这种处理不明显且容易做到 .

  • 9

    我使用TINYINT(1)来在Mysql中存储布尔值 .

    我不知道使用这个是否有任何优势...但如果我没有错,mysql可以存储boolean(BOOL)并将其存储为tinyint(1)

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

  • 1106

    对于MySQL 5.0.3及更高版本,您可以使用 BIT . 手册说:

    从MySQL 5.0.3开始,BIT数据类型用于存储位字段值 . 一种BIT(M)允许存储M位值 . M的范围为1到64 .

    否则,根据MySQL手册,您可以使用bool和boolean,它们是tinyint(1)的别名:

    Bool,Boolean:这些类型是TINYINT(1)的同义词 . 值为零被视为false . 非零值被认为是真实的 .

    MySQL还声明:

    我们打算在未来的MySQL版本中按照标准SQL实现完整的布尔类型处理 .

    参考文献:http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

  • 33

    如果你有很多布尔字段,Bit只比各种字节选项(tinyint,enum,char(1))更有优势 . 一位字段仍占用一个完整字节 . 两个位字段适 Contract 一个字节 . 三,四,五,六,七,八 . 之后他们开始填写下一个字节 . 最终节省的成本非常小,您应该关注数以千计的其他优化 . 除非您处理大量数据,否则这几个字节不会增加太多 . 如果您在PHP中使用bit,则需要对输入和输出的值进行类型转换 .

  • 0

    在这里阅读了答案后,我决定使用 bit(1) ,是的,它在空间/时间方面有所改善,过了一段时间我改变了主意,我再也不会使用它了 . 当使用预处理语句,库等(php)时,它使我的开发变得很复杂 .

    从那时起,我总是使用 tinyint(1) ,似乎已经足够了 .

相关问题