1168 mysql boolean sqldatatypes
由于MySQL似乎没有任何"布尔"数据类型,你滥用'哪种数据类型'来存储MySQL中的真/假信息?
特别是在写入和读取PHP脚本的上下文中.
随着时间的推移,我使用并看到了几种方法:
以上都不是最佳的.我更倾向于使用tinyint 0/1变体,因为PHP中的自动类型转换非常简单地给出了布尔值.
那你使用哪种数据类型?有没有为布尔值设计的类型,我忽略了?您是否看到使用某种类型的优点/缺点?
mar*_*kus 1202
对于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
Phi*_*ton 240
BOOL和BOOLEAN是同义词TINYINT(1).零是false,其他任何东西true.更多信息在这里.
小智 68
这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:
some_flag CHAR(0) DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)
要将其设置为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"中有描述.)
Cia*_*lty 34
如果使用BOOLEAN类型,则将其别名为TINYINT(1).如果您想使用标准化SQL并且不介意该字段可能包含超出范围的值(基本上任何非0的内容都将为'true'),这是最好的.
ENUM('False','True')将允许您使用SQL中的字符串,并且MySQL将在内部将字段存储为整数,其中'False'= 0并且'True'= 1,基于指定Enum的顺序.
在MySQL 5+中,您可以使用BIT(1)字段来指示1位数字类型.我不相信这实际上在存储中使用了更少的空间,但是再次允许您将可能的值约束为1或0.
以上所有内容都将使用大致相同的存储空间,因此最好选择最容易使用的存储空间.
Jos*_*osh 34
这个问题已得到解答,但我想我会投入0.02美元.我经常使用CHAR(0),其中''== true和NULL == false.
来自mysql文档
当你需要一个只能有两个值的列时,CHAR(0)也很好:一个定义为CHAR(0)的列只占用一位,只能取值NULL和''(空字符串) .
Fre*_*red 18
我使用TINYINT(1)来在Mysql中存储布尔值.
我不知道使用这个是否有任何好处...但如果我没有错,mysql可以存储boolean(BOOL)并将其存储为tinyint(1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
Tho*_*hor 17
如果你有很多布尔字段,Bit只对各种字节选项(tinyint,enum,char(1))有利.一位字段仍占用一个完整字节.两个位字段适合同一个字节.三,四,五,六,七,八.之后他们开始填写下一个字节.最终节省的成本非常小,您应该关注数以千计的其他优化.除非您处理大量数据,否则这几个字节不会增加太多.如果您在PHP中使用bit,则需要对输入和输出的值进行类型转换.
小智 12
在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)
Run Code Online (Sandbox Code Playgroud)
您可以在测试时运行这些语句
SELECT (128 & 128) >> 7;
SELECT (0 & 128) >> 7;
Run Code Online (Sandbox Code Playgroud)
等等
由于您有8位,因此一个字节可能有8个布尔变量.一些未来的程序员将总是使用接下来的七位,所以你必须掩盖.不要只是转移,否则你将来会为自己和他人制造地狱.确保你有MySQL进行屏蔽和转移 - 这比使用网络脚本语言(PHP,ASP等)做得快得多.此外,请确保在您的bit_flags字段的MySQL注释字段中添加注释.
在实现此方法时,您会发现这些网站很有用:
Geo*_*all 10
我厌倦了尝试获得零,NULLS,并且''准确地围绕PHP,MySql和POST值循环,所以我只使用'是'和'否'.
这种方法完美无缺,不需要特别的处理,这种处理不明显且容易做到.
参考Mysql中的这个链接 布尔数据类型,根据应用程序的用法,如果只想存储0或1,则bit(1)是更好的选择.
由于 MySQL (8.0.16) 和 MariaDB (10.2.1) 都实现了 CHECK 约束,我现在将使用
bool_val TINYINT CHECK(bool_val IN(0,1))
Run Code Online (Sandbox Code Playgroud)
您将只能存储0,1或NULL以及可以转换为0或1没有错误的值,例如'1', 0x00,b'1'或TRUE/ FALSE。
如果您不想允许 NULL,请添加NOT NULL选项
bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用TINYINT,TINYINT(1)或,则几乎没有区别TINYINT(123)。
如果您希望您的架构向上兼容,您还可以使用BOOL或BOOLEAN
bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))
Run Code Online (Sandbox Code Playgroud)
阅读完这里的答案后,我决定使用它bit(1),是的,它在空间/时间上在某种程度上更好,但过了一段时间我改变了主意,我再也不会使用它了。当使用准备好的语句、库等(php)时,它使我的开发变得非常复杂。
从那时起,我一直使用tinyint(1),似乎足够好。
| 归档时间: |
|
| 查看次数: |
825016 次 |
| 最近记录: |