将值分配给变量时,为什么值会发生变化?

时间:2016-08-28 21:49:40

标签: mysql sql

我有这样一张桌子:
// 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的小数。我需要为@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位数字)确定用户的标记能力(限制)

好的,总之,如何在不转换数据类型的情况下为变量分配位值(这似乎会自动转换,所以我该如何避免呢?

1 个答案:

答案 0 :(得分:0)

它们是相同数字的不同表示,一个在基数2和基数10中。

您仍然可以使用1016位作为标志。

请参阅SQLFiddle