【问题标题】:Alternative to bitwise operation替代按位运算
【发布时间】:2011-07-05 11:23:57
【问题描述】:

场景: 我说过 4 个复选框,用户可以以任意组合选择这些复选框(他们也有权不选择一个复选框)。我必须将这 4 个选项存储到单个列中。我认为最好的选择是使用二进制表示来存储

option1 has the constant value 1 
option2 has the constant value 2
option3 has the constant value 4
option4 has the constant value 8

因此,如果客户选择 option2 和 option4,则存储在 DB 中的值将是 2 + 8 即:10,如果客户选择 option1、option4 和 option8,则值将是 1 + 4 + 8 即 13 .

当我从 mysql 查询时,我可以使用

Select * from option_table where (option & 4)=4;

如果我想检索选择了 option3 的行。

但由于某种原因,我不能使用这种方法,或者只是说我需要知道将这些多个值存储在单个列中的下一个最佳选择是什么?

【问题讨论】:

  • 在单个列中存储多个值是从不正确的解决方案。 “但由于某种原因我不能使用这种方法”继续,给我们一个线索为什么不。
  • 这是一组奇怪的约束。您必须使用一列,但不能使用位掩码。为什么?
  • @symcbean:性能要求通常会覆盖这些规则。
  • 定义“不能使用这种方法” - 你的意思是不允许使用位掩码,还是尝试这样做对你来说失败了?
  • 因为我使用的框架不支持按位运算。

标签: mysql logic


【解决方案1】:

另一种方法是质数相乘。要选择,您将选择质数与列值的模数为 0 的列。

例子:

值 1:2
值 2:3
值 3:5
值 4:7

值 2 和 3 将是 3*5 = 15
值 1、2、3、4 将是 2*3*5*7 = 210

要获取值为 1 的行,请选择 value % 2 == 0 的位置

【讨论】:

  • 如果您不能使用 bit 并且您应该可以使用,select 1 from dual where 4 & 4 = 4; 可以正常工作,但如果您不能使用 bit,这是一个非常可靠的选择。
  • 是的,这个不错。但我会再等一段时间,看看是否有其他方法可以做到这一点。谢谢埃文。
【解决方案2】:

只要位数小于该列类型的位长度,您始终可以使用这种方法。如果要存储更多位,您可以使用多个列(字段)。

您也可以使用Bit Fields

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2015-11-11
    • 1970-01-01
    • 2023-04-06
    • 2014-10-25
    • 2017-11-06
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多