我有一张这样的桌子:
// 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 位数)决定用户的标记能力(限制)。
好的,总而言之,我如何在不转换其数据类型的情况下为变量分配一个位值(这似乎会自动发生转换,所以我该如何避免这种情况)?
也许来自http://dev.mysql.com/doc/refman/5.6/en/bit-functions.html的这句话将有助于澄清:
(5.7 手册页暗示某些未来版本将扩展
BIT
到 64 位之外。)