有没有理由不将SQL中的布尔值存储为位数据类型?

时间:2009-04-22 13:46:03

标签: sql tsql

是否有理由不将SQL中的布尔值存储为没有NULL的位数据类型?我看到它们经常作为整数存储而没有约束来限制值为0和1,并且作为字符串使用T / F,True / False,yes / no等等,再次没有约束。将它们存储为位并不必担心额外的约束是不是更好?我在这里缺少什么?

11 个答案:

答案 0 :(得分:46)

我总是坚持使用我能存储的最小数据类型。

  • SQLServer:BIT
  • Oracle:NUMBER(1)(或PL / SQL中的BOOLEAN)
  • MySQL:TINYINT(iirc BOOLEAN自动映射到此)

编辑: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 =帐户被禁用。

等等。