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