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

Java和MySQL中布尔变量的位标志,java,mysql,bitflags,Java,Mysql,Bitflags,我只想从一系列布尔变量中创建一个位标志,这样我就可以在MySQL数据库中存储一个变量,而不是几个布尔变量。例如,我有三个布尔标志(A、B、C),并希望基于布尔标志的值创建一个单位标志。我认为这会起作用,但我猜有更好(或更清晰)的方法: int myBitFlag = A ? 1:0; myBitFlag += B ? 2:0; myBitFlag += C ? 4:0; 我不确定为什么我找不到关于这个的任何信息,可能是因为我做得不对或者没有使用正确的术语 要选择所有B=true的条目,我会使用

我只想从一系列布尔变量中创建一个位标志,这样我就可以在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

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

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

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

IF(bitColumnC, 4, 0)
如果应用程序需要整数值4作为选择输出,则获取整数值4。此外:

IF(bitColumnA, 1, 0) + IF(bitColumnB, 2, 0)
如果你真的必须把它作为一个整数


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

我认为将一个位打包成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;
  }
publicstaticvoidmain(字符串[]args)
{
布尔值a=真;
布尔b=假;
布尔c=真;
int标志=0;
标志|=比特(a,0);
标志|=比特(b,1);
标志|=biteIt(c,2);
System.out.println(标志);
}
私有静态int-biteIt(布尔b,int-place){

return b?1《代码完成》一书中有关于如何执行此操作(以及何时/何时不执行此操作)的示例,出于许多其他原因,这本书是一本很好的读物。如果您是一名程序员,还没有将其签出,您应该看看。