0

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

3 回答 3

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;
  }
于 2012-09-13T21:51:48.477 回答
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 相同。

于 2012-09-13T21:46:11.363 回答
0

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

于 2012-09-13T21:38:11.333 回答