来自Java和MySQL中布尔变量的位标志

时间:2012-09-13 21:20:27

标签: java mysql bitflags

我只想从一系列布尔变量中创建一个位标志,这样我就可以在MySQL数据库中存储一个变量而不是几个布尔变量。例如,我有三个布尔标志(A,B,C),并希望根据布尔标志的值创建一个位标志。我认为这会有效,但我猜测有更好(或更清晰)的方法:

int myBitFlag = A ? 1:0;
myBitFlag += B ? 2:0;
myBitFlag += C ? 4:0;

我不确定为什么我找不到任何关于此的内容,也许是因为我做错了或者没有使用正确的术语..

要选择B = true的所有条目,我会使用它吗?

SELECT * FROM table WHERE myBitFlag & 2 = 1

3 个答案:

答案 0 :(得分:1)

我认为将一个位打包到int中的一般方法是将值向左移位一定数量的位。例如,如果您希望A位为0,B位于位1,C位于位2,则可以执行以下操作:

  public static void main(String[] args)
  {
    boolean a = true;
    boolean b = false;
    boolean c = true;

    int flag = 0; 
    flag |= biteIt(a,0);
    flag |= biteIt(b,1);
    flag |= biteIt(c,2);
    System.out.println(flag);
  }

  private static int biteIt(boolean b, int place) {
    return b ? 1 << place : 0;
  }

答案 1 :(得分:0)

将它们作为单独的INT(1)存储在SQL中,让数据库为您优化存储。这样,您就可以在标志上创建索引,这对于快速选择至关重要。

答案 2 :(得分:0)

不使用正确的“BIT NOT NULL”SQL类型来允许数据库优化存储并在独立列上执行WHERE子句表达式。这是使用SQL来描述您的数据以便优化搜索的目的。

如果确实需要位掩码值,则可以始终使用SELECT输出部分中的表达式:

IF(bitColumnC, 4, 0)

如果应用程序需要SELECT输出,则获取整数值4。也:

IF(bitColumnA, 1, 0) + IF(bitColumnB, 2, 0)

如果你真的必须将它作为一个整数。

否则为什么要将它们保存为SQL中的位字段,只需在SQL中使用INT类型并在客户端软件中进行屏蔽。使用INT(1)与BIT相同。