2016-08-28 3 views
-1
が、私はこのようなテーブルがあります:あなたが見たよう
// 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]を、結論では、どのように私は、そのデータ型(変換が自動的に起こったことになるので、どのように私がいることを避けることができると思われる)を変換せずに変数にビット値を割り当てることができますか?

+0

「1016」は、バイナリ「01111111000」の10進表記です。バイナリを使用するのと同じ方法でビット操作で使用できます。 –

+0

@AlexKudryashev興味深い..ありがとう。 –

答えて

0

彼らはあなたは、まだフラグとして1016ビットを使用することができ、異なる同じ数、ベース2内の1つの表現とベース10

あります。

SQLFiddle

+0

「1016&b'10」と「01111111000&b'10」は同じですか?私は両方が同じものを扱うのだろうか? –

+0

はい同じです。リンクされたフィドルを見てください。 – Bohemian

関連する問題