2

簡単に言えば

テーブルのintタイプ フィールドに 2 進数の 4 桁の数字 (0 と 1 の組み合わせ、1010、0110 など) が含まれているとします。他の数字を変更せずに、これらの数字の一部のみを選択的に更新するにはどうすればよいですか。

詳細テーブルには、この特定の権限が関連するアカウントの種類を表す 4 桁
user_relevance_codeフィールド(タイプは ) があります。これらの 4 桁には 1 または 0 が格納され、それぞれ関連するかどうかを意味します。左から右に、これらのアカウント タイプへの関連性 - 、、が格納されます。したがって、このフィールドに格納された値は、マネージャー、パブリッシャーに関連し、広告主には関連しないことを意味します。permissionsint(10)ManagerPublisherAdvertiserDeveloper0110

ここで、いつでも、これらのアクセス許可の一部をマネージャーに関連するものとしてマークするか、広告主とパブリッシャーに関連するようにし、同時にマネージャーに関連しないようにする必要があるとします。そのようなすべてのケースで、他の数字はそのままにしておく必要があります。つまり、マネージャーの関連性の数字のみを更新する必要がある場合は、発行元と広告主の数字に触れるべきではありません。

問題
現在の値を適用してuser_relevance_code保存する必要があるコードのバイナリ OR を実行する必要があることは明らかですが、これはうまくいきません。

パブリッシャーに関連するいくつかのアクセス許可を作成する操作のために、このクエリを試しました-

update permissions set user_relevance_code = (0100 | user_relevance_code) where <condition to update some permissions>

しかし、これは望ましい結果をもたらしませんでした。1000以前に持っていたレコードは1004、私が望んでいた に更新されました1100(2 桁目のみを 1 に更新し、他のものはそのままにしておきます)。

また、そのフィールドのタイプを に変更してみましたbinary。私はそれを間違っていると思います。

4

1 に答える 1

2

MySQLでは、0100は10進数であり、2進数ではありません。そのため、は1004を取得します100 | 10002 2ビットが設定されていることを確認したい場合は、次のようにします。

user_relevance_code = b'100' | user_relevance_code

または、わかりやすくするために4ビットすべてを指定する場合(ビットラングリングの場合は良い考えです):

user_relevance_code = b'0100' | user_relevance_code

user_relevance_code上記のすべては、 2進数のように見える10進数(1000、1101、110など)ではなく、実際にビットマップを格納していることを前提としています。値が実際に10進数である場合、ビット演算はジョブに最適なツールではないため、次のような不快なものを使用することをお勧めします。

user_relevance_code = (user_relevance_code div 1000) * 1000 + 100 + (user_relevance_code % 100)

他の3桁をそのままにして、102桁を強制的に1にします

私は、ビットラングリングはSQLで行うのは実際には自然なことではないと言わざるを得ません。個別の(ユーザー、権限)関連付けテーブルの方がはるかに自然です。次に、単純な結合、挿入、および削除を使用して権限セットを操作します。もちろん、スキーマを制御できない場合は、自分が持っているものを使用する必要があります。

于 2012-01-06T09:23:36.230 に答える