2016-08-28 5 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) относится к чему-то. Например, второй бит определяет ограничение пользователя при голосовании. Я бы назвал его первой цифрой (справа налево) 1, это значит, что пользователь может голосовать, если он 0 это означает, что пользователь запретил голосовать.

В любом случае, мне не нужно получать десятичные числа 1016. Мне нужно назначить и сохранить именно это 11-битное число до переменной @ban. Потому что мне нужно проверить его вот так:

IF (IFNULL((@ban & b'10' > 0), 0) < 1) THEN 
-- user can vote 
ELSE 
-- user cannot vote 
ENDIF; 

Так что для каждой цифры есть разные действия. Вот почему я не хочу 10-основанный номер, например 1016. Я хочу, чтобы в этой переменной был бит-основанный номер 01111111000.

Для того, чтобы было более понятно, вот это задача третьей цифры:

IF (IFNULL((@ban & b'100' > 0), 0) < 1) THEN 
-- user can flag 
ELSE 
-- user cannot flag 
ENDIF; 

См? третья цифра (из этого 11-разрядного номера) определяет способность пользователя помечать (ограничение).


Хорошо, в заключение, как я могу присвоить немного значение переменной без преобразования его тип (который, кажется, преобразовывая будет произошло автоматически, так как я могу избежать этого)?

+0

'1016' десятичное представление двоичного' 01111111000'. Вы можете использовать его в битовой операции так же, как вы используете двоичный файл. –

+0

@AlexKudryashev интересный .. спасибо. –

ответ

0

Они разные представления одного и того же числа, один в основании 2 и основанием 10.

Вы можете использовать биты 1016 в качестве флагов.

См SQLFiddle

+0

Вы имеете в виду '1016 & b'10'' и' 01111111000 & b'10'' идентичны? Я имею в виду, будут ли оба они относиться к тому же самому? –

+0

Да, то же самое. См. Связанный скрипт. – Bohemian

Смежные вопросы