Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当我将值赋给变量时,为什么该值会发生变化? 我有一张这样的桌子: // mytable +---------+-------------+ | id | ban | +---------+-------------+ | int(11) | BIT(11) | +---------+-------------+ | 1 | 01111111000 | | 2 | 01111111111 | | 3 | 00000000001 | +---------+-------------+_Mysql_Sql - Fatal编程技术网

Mysql 当我将值赋给变量时,为什么该值会发生变化? 我有一张这样的桌子: // mytable +---------+-------------+ | id | ban | +---------+-------------+ | int(11) | BIT(11) | +---------+-------------+ | 1 | 01111111000 | | 2 | 01111111111 | | 3 | 00000000001 | +---------+-------------+

Mysql 当我将值赋给变量时,为什么该值会发生变化? 我有一张这样的桌子: // mytable +---------+-------------+ | id | ban | +---------+-------------+ | int(11) | BIT(11) | +---------+-------------+ | 1 | 01111111000 | | 2 | 01111111111 | | 3 | 00000000001 | +---------+-------------+,mysql,sql,Mysql,Sql,如您所见,ban列的值是一个二进制数(其数据类型是位(11))。当我选择它时,值仍然是一个二进制数,如下所示: SELECT ban FROM mytable WHERE id = 1; -- output: 01111111000 SELECT ban INTO @ban FROM mytable WHERE id = 1; SELECT @ban; -- output: 1016 IF ( IFNULL((@ban & b'10' > 0), 0) < 1 ) TH

如您所见,
ban
列的值是一个二进制数(其数据类型是
位(11)
)。当我选择它时,值仍然是一个二进制数,如下所示:

SELECT ban FROM mytable WHERE id = 1;
-- output: 01111111000 
SELECT ban INTO @ban FROM mytable WHERE id = 1;
SELECT @ban;
-- output: 1016
IF ( IFNULL((@ban & b'10' > 0), 0) < 1 ) THEN
 -- user can vote
ELSE 
-- user cannot vote
ENDIF;
但是当我把它赋给一个变量时,令人惊讶的是,值会发生变化,如下所示:

SELECT ban FROM mytable WHERE id = 1;
-- output: 01111111000 
SELECT ban INTO @ban FROM mytable WHERE id = 1;
SELECT @ban;
-- output: 1016
IF ( IFNULL((@ban & b'10' > 0), 0) < 1 ) THEN
 -- user can vote
ELSE 
-- user cannot vote
ENDIF;
那么,当我将
0111111000
设置为
@ban
时会发生什么?为什么要更改它(
1016


你知道吗?实际上,该11位数字(
011111000
)的每个数字(位)都表示某个东西。例如,第二位决定用户对投票的限制。我的意思是,第一个数字(从右到左)是
1
,表示用户可以投票,如果是
0
,则表示用户被禁止投票

无论如何,我不需要这样的小数
1016
。我需要为
@ban
变量精确地分配并保留该11位数字。因为我需要这样检查:

SELECT ban FROM mytable WHERE id = 1;
-- output: 01111111000 
SELECT ban INTO @ban FROM mytable WHERE id = 1;
SELECT @ban;
-- output: 1016
IF ( IFNULL((@ban & b'10' > 0), 0) < 1 ) THEN
 -- user can vote
ELSE 
-- user cannot vote
ENDIF;
看到了吗?第三位数字(11位数字)确定用户的标记能力(限制)



好的,总而言之,在不转换变量数据类型的情况下,我如何为变量分配位值(转换似乎会自动进行,因此我如何避免这种情况)?

它们是相同数字的不同表示形式,一个在基数2,一个在基数10

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


参见
1016
是二进制的十进制表示法
0111111000
。您可以在位操作中使用它,就像使用二进制一样。@AlexKudryashev有趣。。谢谢。你是说
1016&b'10'
0111111000&b'10'
是相同的吗?我的意思是,他们两个会一样对待吗?是的,一样。参见链接小提琴。