0

一連のブール変数からビット フラグを作成して、複数のブール値ではなく 1 つの変数を MySQL データベースに格納できるようにしたいだけです。たとえば、3 つのブール フラグ (A、B、C) があり、ブール フラグの値に基づいて 1 つのビット フラグを作成したいとします。これでうまくいくと思いますが、これを行うためのより良い(またはより読みやすい)方法があると思います:

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 にパックする一般的な方法は、値を特定のビット数だけ左にシフトすることだと思います。たとえば、ビット 0 で A、ビット 1 で B、ビット 2 で C が必要な場合は、次のようにすることができます。

  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

それらを別々INT(1)の として SQL に保存し、データベースがストレージを最適化できるようにします。このようにして、迅速な選択に不可欠なフラグにインデックスを作成できます。

于 2012-09-13T21:38:11.333 に答える
0

データベースがストレージを最適化し、独立した列で WHERE 句の式を実行できるようにするには、正しい "BIT NOT NULL" SQL 型を使用しないでください。これは、SQL を使用してデータを十分に記述し、検索を最適化する目的です。

本当にビットマスク値が必要な場合は、SELECT 出力部分でいつでも式を使用できます。

IF(bitColumnC, 4, 0)

アプリケーションで SELECT 出力に整数値 4 が必要な場合に、整数値 4 を取得します。また:

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

本当に単一の整数として持つ必要がある場合。

それ以外の場合は、SQL でビット フィールドとして保持し、SQL で INT 型を使用して、クライアント ソフトウェアでマスキングを行うだけです。INT(1) の使用は BIT と同じです。

于 2012-09-13T21:46:11.363 に答える