【问题标题】:Are there reasons for not storing boolean values in SQL as bit data types?是否有理由不在 SQL 中将布尔值存储为位数据类型?
【发布时间】:2009-04-22 13:46:03
【问题描述】:

是否有理由不在 SQL 中将布尔值存储为没有 NULL 的位数据类型?我看到它们通常存储为没有约束的整数,以将值限制为 0 和 1,以及作为带有 T/F、True/False、yes/no 等内容的字符串,同样没有约束。将它们存储为位而不用担心额外的约束不是更好吗?我在这里错过了什么?

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

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

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

    编辑:Oracle 的 BOOLEAN 仅是 PL/SQL,而不是表定义。更新了答案以反映这一点。

    【讨论】:

    • 回复。 “可用的最小数据类型”:SQL Server BIT 值实际上不是一位宽,而是一个完整字节宽的倍数。但是,同一个表中的多个 BIT 被折叠到同一个存储中。
    • MySQL 也支持 BIT 类型,其存储要求与 Tomalak 解释的完全一样。
    • @Chad:MySQL BIT 列与 SQLServer BIT 列明显不同; SQLServer BIT 字段只存储一个值,如果有多个,则在存储时将 BIT 字段组合在一起。 MySQL BIT 字段是 1 到 64 位的位掩码(基于声明)。
    • 重要的是我可以在 WHERE 子句中轻松使用 SQLServer BIT 字段,而如果 BIT 列中有多个值,我必须在 MySQL 中进行位移。不幸的是,MySQL 的 BOOLEAN 类型也不像 SQLServer 的 BIT 字段那样映射出来,而是用 TINYINT 代替。不过,MySQL 确实将 TRUE 识别为 1,将 FALSE 识别为 0。
    • Oracle 人经常使用 CHAR(1) 作为布尔值。
    【解决方案2】:

    通常会发生的情况是有人想在 yes 和 no 中添加可能,如果你有一点,那么现在你必须将所有代码更改为 tinyint

    如果你一开始就有 tinyint,那么你不会.....相信我这种情况比你想象的要多

    【讨论】:

    • +1 我以前也遇到过这种情况……不常见,但它已经抬起了丑陋的脑袋。
    • 想想,重构通常没那么难。
    • +1 我发现它可以在其生命周期的某个时刻从布尔值变为状态或状态列。
    • @mattruma 你没有考虑到懒惰:)
    【解决方案3】:

    我看到它们经常存储为整数 没有限制将值限制为 0 和 1,以及作为字符串的东西 如 T/F、True/False、yes/no 等, 再次没有限制。是不是 最好将它们存储为位而不是 不得不担心额外的 约束?

    是的!

    我在这里错过了什么?

    实际上应该是“我在这里没有错过什么?”答案是:常识

    【讨论】:

      【解决方案4】:

      不这样做的一些原因包括:

      并非所有数据库都有位数据类型,因此您使用 int 来代替能够使用不同的后端

      在某些数据库中,您不能索引位字段。

      通常你所拥有的并不是真正的真/假,是/否,没有其他可能性。例如,您可能有一个状态位字段,表示打开或关闭之类的东西。但后来你意识到你也需要取消作为一种状态。

      【讨论】:

        【解决方案5】:

        当我想要数据库中的布尔值时,我总是使用位数据类型。在 SQL 中,它们可以为 NULL。但是在运行程序时,您必须考虑 bool(例如在 C# 中)是一种值类型,在这种情况下不能为 NULL。您必须与 System.DBNull 值进行比较。

        【讨论】:

        • 您不能将变量指定为 Nullable,这样会处理 NULL 值吗?
        • 问题是 ADO.NET 支持什么或其他一些数据访问框架。如果它允许 Nullable 我们没问题!
        【解决方案6】:

        我们总是将数据存储为一点,它很小,更重要的是,它是为这种情况而设计的。

        我们曾经有过最终用户要直接处理数据的情况,对他们来说,是/否或是/否更具可读性。在这种情况下,我们只是创建了一个反映更友好数据显示的视图。

        【讨论】:

        • 我在提交第一个项目后的最后 2 个工作,他们让我回去将所有的 0 更改为“N”,将 1 更改为“T”两者的原因完全相同。 “我们永远不记得哪个是哪个”我认为 0=false 是在计算 101,但显然不知道是很常见的。或者这可能表明我没有选择好的工作场所。
        • Y 或 N 是演示详细信息。它应该存储为 0/1(位),但是在向用户呈现数据时(例如,在报告中(或者可能在用于演示的视图中,虽然很糟糕)),而不是在数据库存储中。
        【解决方案7】:

        BIT 是通常用于存储 BOOLEAN 值的数据类型。仅仅是因为如果 BIT 为 1 则为真,为 0 则为假。就是这么简单。

        【讨论】:

          【解决方案8】:

          如果您有两个以上的状态,请使用 Enum。

          【讨论】:

            【解决方案9】:

            一个原因是人们不了解位或认为 y/n 更易于格式化。 另一个原因是有时你会想:嗯,也许随着时间的推移,这将不仅仅是一个布尔字段。以防万一。

            你没有错过任何东西:)

            【讨论】:

              【解决方案10】:

              我认为第三种规范化形式会声明您应该有一个存储值 True 和 False 的表,并引用它。确保你对你的约会也这样做!

              但是到底谁会完全遵守 3NF? ;)

              【讨论】:

              • 您可能希望为您的第三范式定义找到不同的来源。没有任何内容表明所有列中的所有值也必须存储在某个地方的表中。
              【解决方案11】:

              我经常用一点。但有时我希望能够返回 false - 或许多 true 值(如错误消息)。因此,如果我使用 int 而不是 boolean,我可以执行以下操作:

              0 = 错误 1 = 密码错误 2 = 用户名不存在。 3 = 帐户被锁定 - 多次尝试失败。 4 = 帐户已禁用。

              等等。

              【讨论】:

              • 那不是布尔值。这是一个代码值。根据定义,布尔值是真或假,并且没有多个真定义。
              • 正如我所说,我经常使用 bit。然后我给出了一个替代解决方案。如果您阅读我的帖子,我说过有时我会使用 int 而不是 boolean。
              猜你喜欢
              • 2010-09-15
              • 2014-03-04
              • 1970-01-01
              • 1970-01-01
              • 2013-09-23
              • 2010-09-22
              相关资源
              最近更新 更多