// 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
)?
01111111000
)的每个数字(位)指的是某些东西。例如,第二位确定用户对投票的限制。我的意思是第一个数字(从右到左)是1
,这意味着用户可以投票,如果是0
则意味着用户被禁止投票。
无论如何,我不需要得到像这样1016
的小数。我需要为@ban
变量分配并保留该11位数字。因为我需要像这样检查:
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位数字)确定用户的标记能力(限制)。
好的,总之,如何在不转换数据类型的情况下为变量分配位值(这似乎会自动转换,所以我该如何避免呢??