【问题标题】:Can I save 7 booleans in 1 column?我可以在 1 列中保存 7 个布尔值吗?
【发布时间】:2011-07-08 08:10:05
【问题描述】:

现在我的 MySQL 表中有 7 列:

monday
tuesday
wednesday
..

它们都是布尔值。有没有办法通过使用 bitset/bitmap 或其他方式将这些布尔值组合到单个 days 列中?

我还希望能够查询启用了特定日期的行。我现在使用的查询是:

SELECT id FROM rows WHERE thursday = 1

多天可以,但我一次只需要查询1天。

【问题讨论】:

  • 您在寻找什么查询来修改数据?
  • 难道你不能只有一个带有代表星期几的数字的列。比如 1=星期一...7=星期日?或者您是否可能在这里拥有超过一天的列收益?
  • @Ramy:假设提到位列并要求合并,我会说这是一个准确的结论;可能存在多天。
  • 为什么要将所有值存储在单个列中?有明显的缺点(查询复杂性、索引使用),那么您希望通过这样做获得什么?另外,您使用的是什么 DBMS?

标签: mysql sql bitmap boolean bit-manipulation


【解决方案1】:

您有什么理由要将它们全部存储在一列中吗?

有很多方法,但如果你走这条路,你就会遇到问题。例如,如果您想查看“星期四”期间哪些行处于活动状态,则必须查看每一行,运行一些函数来“清除”您的数据,然后解析您的结果。

如果它只有 7 个布尔值,为什么不做一个可以存储 0-2^8 的列并为每一天分配一点?

【讨论】:

  • 是的,这就是我要找的东西,但我真的不知道该怎么做。
  • 创建一个你在 MySQL 中最小的列,也许是 tinyint。 sunday = 1, monday = 2, etc. 如果它在周日和周二有效,那么给它一个值 2^1(Sunday) + 2^3(Tuesday) = 2 + 8 = 10
  • 谢谢,我会调查的。我想将它们存储在一列中的原因只是为了我的代码简洁。
  • 将它们存储在一列中会扩展您的代码,而不是使其更小。
  • @Rits — 将多个独立的数据值打包到单个列中更有可能减少代码的简洁性,因为打包/解包需要额外的机器。
【解决方案2】:

是的,这是可能的,但是您会松散规范化,并且某些查询将很难编写。

例如 - 如果您想知道每天有多少次出现在表格中(比如有多少个星期二),这种设计会使其变得非常困难和低效。

最好在表中使用 7 位字段。

【讨论】:

  • +1,虽然这比WHERE (Column & 1) = 1 有什么好处?只是为了可读性?
  • @Brad - 如果它全部在一个列中,我不相信它会被索引。我知道他们不断改进索引,但我认为不会涵盖这种情况。
  • @MikeM:好点,你必须审问每一行。感谢您的反馈。
【解决方案3】:

让我告诉你我的经验。我也有类似的需要来存储应用程序权限的位掩码。

实现起来非常简单,您只需将字段设置为标准整数类型并与相关位掩码进行 AND 以检查是否设置了特定项目,并使用 OR 设置特定项目。

也就是说,我现在后悔了。它实际上使您的代码更加复杂,并且我了解到您不会真正从该列上的索引中获得太多有意义的使用,从而导致查询性能不佳。接受我的建议,将其作为 7 个单独的位/布尔字段来执行,特别是考虑到他们不会很快发明新的工作日,因此使用位掩码的灵活性无论如何都是一种浪费。聪明的位掩码解决方案没有回报。

【讨论】:

    【解决方案4】:

    您可以使用 1 个字节来存储您的 7 位并剩余 1 位,但是强烈建议您为每个位使用不同的列

    【讨论】:

      【解决方案5】:

      Set datatype 的 MySQL 会很好。 Storage used 是位图。

      【讨论】:

        【解决方案6】:

        我认为@Mike M 就在这里。 因此,例如,您有一个可能如下所示的表:

        monday | tuesday | wednesday | thursday | friday | saturday | sunday
        

        true   | false   | false     | true     |  false |  false   | true
        

        这可以在一列中表示为:

         | days |
         --------
          1001001
        

        我不确定这对您有多大帮助,您只需解析 days 列即可查看哪些日期处于活动状态。

        【讨论】:

          【解决方案7】:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-13
            • 2014-02-13
            • 1970-01-01
            • 2012-07-22
            • 1970-01-01
            • 2020-02-19
            • 2011-06-12
            • 1970-01-01
            相关资源
            最近更新 更多