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