// 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-разрядного номера) определяет способность пользователя помечать (ограничение).
Хорошо, в заключение, как я могу присвоить немного значение переменной без преобразования его тип (который, кажется, преобразовывая будет произошло автоматически, так как я могу избежать этого)?
'1016' десятичное представление двоичного' 01111111000'. Вы можете использовать его в битовой операции так же, как вы используете двоичный файл. –
@AlexKudryashev интересный .. спасибо. –