是否有理由不将SQL中的布尔值存储为没有NULL的位数据类型?我看到它们经常作为整数存储而没有约束来限制值为0和1,并且作为字符串使用T / F,True / False,yes / no等等,再次没有约束。将它们存储为位并不必担心额外的约束是不是更好?我在这里缺少什么?
答案 0 :(得分:46)
我总是坚持使用我能存储的最小数据类型。
编辑:Oracle的BOOLEAN只是PL / SQL,而不是表定义。更新了答案以反映这一点。
答案 1 :(得分:14)
通常发生的事情是有人想要添加一个也许是和否,如果你有一点,那么现在你必须将你的所有代码更改为tinyint
如果你开始使用tinyint,那么你就不要......相信我这比你想象的更多
答案 2 :(得分:9)
我看到它们经常以整数形式存储 没有约束来限制值 0和1,以及作为字符串的东西 喜欢T / F,真/假,是/否等等, 再次没有约束。不是吗 最好将它们存储为比特而不是 不得不担心额外的 限制?
是!
我在这里缺少什么?
实际上它应该是“我在这里不缺少什么?”答案是:常识。
答案 3 :(得分:5)
不这样做的一些原因包括:
并非所有数据库都有一个数据类型,因此您可以使用int来代替使用不同的后端
在某些数据库中,您无法索引位字段。
通常你所拥有的并不是真正的错误,是/否,没有其他可能性。例如,您可能有一个状态的位字段意味着打开或关闭。但后来你意识到你也需要取消作为一种身份。
答案 4 :(得分:4)
当我想在数据库中使用布尔值时,我总是使用位数据类型。在SQL中,它们可以为NULL。但是在运行程序时,你必须考虑bool(例如在C#中)是一种值类型,在这种情况下不能为NULL。您必须与System.DBNull值进行比较。
答案 5 :(得分:4)
我们总是将数据存储起来,它很小,更重要的是它是专为此设计的。
我们曾经有过最终用户直接使用数据的时间,对于他们来说,是/否或Y / N更具可读性。在这种情况下,我们刚刚创建了一个反映友好数据显示的视图。
答案 6 :(得分:4)
BIT是通常用于存储BOOLEAN值的数据类型。仅仅因为如果BIT为1则为真,0则为假。就这么简单。
答案 7 :(得分:1)
如果您有两种以上的状态,请使用枚举。
答案 8 :(得分:0)
一个原因是人们不知道有点或认为y / n更容易格式化。 另一个原因是,有时你会想:嗯,也许随着时间的推移,这将不仅仅是一个布尔场。并且为了以防万一你把它变成int。
你没有遗漏任何东西:)
答案 9 :(得分:0)
我认为第三个规范化形式会声明你应该有一个存储值True和False的表,并引用它。确保你也和你的日期一样!
但是谁还完全遵守3NF? ;)
答案 10 :(得分:-1)
我经常使用它。但有时我希望能够返回false - 或许多true值(如错误消息)。所以,如果我使用int而不是boolean,我可以这样做:
0 =假 1 =密码不正确 2 =用户名不存在。 3 =帐户被锁定 - 许多失败的尝试。 4 =帐户被禁用。
等等。