// mytable
+---------+-------------+
| id | ban |
+---------+-------------+
| int(11) | BIT(11) |
+---------+-------------+
| 1 | 01111111000 |
| 2 | 01111111111 |
| 3 | 00000000001 |
+---------+-------------+
を、ban
列の値が進数(そのデータ型がBIT(11)
ある)です。そして、私はそれを選択すると、値は次のように、まだ進数です:変数に変数を代入すると値が変わるのはなぜですか?
SELECT ban FROM mytable WHERE id = 1;
-- output: 01111111000
しかし、私は、変数にこのような驚くほど値が変化し、それを割り当てるとき:
SELECT ban INTO @ban FROM mytable WHERE id = 1;
SELECT @ban;
-- output: 1016
をよくするもの01111111000
を@ban
に設定するとどうなりますか?なぜ変更されるのですか(1016
)?
ご存知ですか?実際には、各桁(ビット)の11ビット番号(01111111000
)が参照されます。例えば、第2のビットは、投票に対するユーザの制限を決定する。私はそれが0
である場合、最初の数字(右から左)がであることを意味します。ユーザーが投票できることを意味します。つまり、投票が禁止されています。
とにかく、私はこのような小数を得る必要はありません1016
。その11ビット番号を@ban
変数に割り当てて正確に保持する必要があります。
IF (IFNULL((@ban & b'10' > 0), 0) < 1) THEN
-- user can vote
ELSE
-- user cannot vote
ENDIF;
したがって、各桁に異なるアクションがあります。だから私は1016
のような10ベースの番号は欲しくない。私は、この変数のようなビットベースの番号01111111000
が欲しいです。
IF (IFNULL((@ban & b'100' > 0), 0) < 1) THEN
-- user can flag
ELSE
-- user cannot flag
ENDIF;
参照してください:
はより明確に、ここでの3桁目の課題であるようにするには? 3番目の数字(その11ビット番号の)は、ユーザーのフラグ機能を決定します(制限)。
[OK]を、結論では、どのように私は、そのデータ型(変換が自動的に起こったことになるので、どのように私がいることを避けることができると思われる)を変換せずに変数にビット値を割り当てることができますか?
「1016」は、バイナリ「01111111000」の10進表記です。バイナリを使用するのと同じ方法でビット操作で使用できます。 –
@AlexKudryashev興味深い..ありがとう。 –