我在users
表中有一个名为permissions
的列。像这样:
// users
+---------+-----------------+-------------+
| id | permissions | name |
+---------+-----------------+-------------+
| int(11) | bit(15) | varchar(20) |
+---------+-----------------+-------------+
| 1 | 001100001111101 | Jack |
| 2 | 111111111111111 | Peter |
| 3 | 110000000111011 | Martin |
+---------+-----------------+-------------+
如您所见,permissions
列具有 bit(15)
数据类型。该值的每一位都决定一个用户的能力。例如,第一位指的是投票
能力,第二位指的是评论
能力等等...
我还有一个触发器BEFORE UPDATE
,它会像这样调查该权限:
SELECT permissions INTO @deleting_permission FROM users WHERE id = new.deleter_id;
IF old.deleted <> new.deleted THEN
IF (IFNULL((@deleting_permission & b'10000000000' > 0), 0) < 1) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "You cannot delete post";
END IF;
END IF;
并且总是抛出:
You cannot delete post
即使是具有 111111111111111
权限值的 #2 用户。那么出了什么问题?
注意到我更新了 permissions
列,如下所示:
-- To give some specific accesses (permissions) to the user
UPDATE users SET permissions = b'111111000101011' WHERE id = ?
-- To give full access (permissions) to the user
UPDATE users SET permissions = -1 WHERE id = ?
最佳答案
您在触发器中选择字段active
来检查权限,但根据您的问题,权限保留在permissions
字段中。
更改您的查询以使用后一个字段:
SELECT `permissions` INTO @active_deleter FROM users WHERE id = new.deleter_id;
此外,您的permissions
字段有 15 位。您使用的掩码只有 10 个。您应该首先检查是否测试了正确的位。
关于mysql - 如何检查 MySQL 中的 BIT 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501853/