mysql - 如何检查 MySQL 中的 BIT 数据类型?

标签 mysql sql bit

我在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/

相关文章:

mysql - 合并多行的sql查询

mysql - 多个主机名和多个权限?

query_posts 后 MySQL 错误 "Query execution was interrupted"

c - C中位数组的结构

c - 应该使用类型转换来设置位域吗?

mysql - 数据库设计: Year table normalization

mysql - 跨 Heroku 将并行化的 Python 抓取到数据库中

php - '%deb %' is showing up as ' �b%' 当我发送 $_GET 查询时?

php - 如何在codeigniter中从db中获取数据

C++ 字节依赖于实现