我可以在1列中保存7个布尔值吗?

时间:2011-03-03 20:04:58

标签: mysql sql bitmap boolean bit-manipulation

现在我的MySQL表中有7列:

monday
tuesday
wednesday
..

他们都是布尔人。有没有办法通过使用bitset / bitmap或其他东西将这些布尔值组合在一个days列中?

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

SELECT id FROM rows WHERE thursday = 1

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

7 个答案:

答案 0 :(得分:4)

是否有任何理由要将它们全部存储在一列中?

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

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

答案 1 :(得分:3)

是的,这是可能的,但是你没有规范化,某些查询将很难编写。

例如 - 如果你想知道每天出现多少次事件(比如星期二),这种设计会让它变得非常困难和低效。

表中的7位字段最好。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

答案 4 :(得分:0)

您可以使用1个字节来存储7位并保留1位,但建议每个位使用不同的列

答案 5 :(得分:0)

MySQL的

Set datatype会很好。 Storage used因为它是位图。

答案 6 :(得分:0)

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

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

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

这可以在一栏中表示为:

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

我不确定这对你有多大帮助,你只需解析日期栏,看看哪些日子有效。