2011-03-03 52 views
1

现在我有我的MySQL表7列:我可以在1列中保存7个布尔值吗?

monday 
tuesday 
wednesday 
.. 

他们都是布尔值。有没有一种方法可以将这些布尔值组合成一个days列,通过使用位集/位图或其他?

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

SELECT id FROM rows WHERE thursday = 1 

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

+0

你在寻找什么修改数据的查询? – madmik3 2011-03-03 20:08:29

+0

难道你不能只有一个表示星期几的数字。像1 =星期一... 7 =星期天? 或者您是否有可能在这里有超过一天的专栏产量? – Ramy 2011-03-03 20:09:48

+0

@Ramy:假设提及位列并要求合并,我会说这是一个准确的结论;多天可能存在。 – 2011-03-03 20:15:03

回答

4

有你想他们都存储在一个任何理由柱?

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

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

+0

是的,这就是我正在寻找的,但我真的不知道该怎么做。 – Rits 2011-03-03 20:10:16

+0

创建一个列,无论您在MySQL中使用的最小,也许是tinyint。星期日= 1,星期一= 2等。如果周日和周二有效,则给它一个值2^1(星期日)+ 2^3(星期二)= 2 + 8 = 10 – 2011-03-03 20:12:08

+0

谢谢,我会研究一下。我想将它们存储在一列中的原因仅仅是为了简化我的代码。 – Rits 2011-03-03 20:16:29

3

是的,这是可能的,但你失去的正常化和某些查询将是非常难写。例如 - 如果您想知道每天在表格中出现多少次事件(比如周二有多少次),则此设计会使其非常困​​难且效率低下。

你最好用表中的7位字段。

+0

+1,但是这对'WHERE(Column&1)= 1'有什么好处?纯粹的可读性为什么? – 2011-03-03 20:12:31

+0

@Brad - 我不认为如果它全部在一列中,它将被编入索引。我知道他们不断提高指数,但我认为这种情况不会被覆盖。 – 2011-03-03 20:14:28

+0

@MikeM:好点,你将不得不询问每一行。感谢您的反馈。 – 2011-03-03 20:16:37

0

你可以使用1个字节来存储您的7位,并有1位遗留下来的,但它是非常可取的,只是使用不同的列每一位

0

我认为@Mike M就在这里。 因此,举例来说,您有一个表看起来像这样的:

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

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

这可能在一列被respresented为:

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

我不知道这真的会给你带来多少好处,你只需要解析日期列来查看哪些日子是活跃的。

2

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

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

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

相关问题