1

我在 SQL 上使用Bit bashing来获取用户权限,例如 UNIX 权限:

1 - 001 - 执行

2 - 010 - 写

4 - 100 - 阅读

因此,如果我有正确的 6(2+4 或 110)我可以读写但我不能执行。就我而言,我拥有更多权利,因此我的用户可以拥有“128”的权利值。

如何进行查询并询问所有使用权限(如 2 用于 UNIX 示例)

SELECT * from user WHERE user_right ?? '2'

用户权限必须是2(010)、3(011)、6(110)或7(111)?!

谢谢大家,对不起我的英语:/

4

1 回答 1

0

128 意味着总共有 7 个用户权限:

1 1 1 1 1 1 1 = 0177 = 0x7F = 127

MySQL 已经对此有一个抽象,称为SETtype,它本质上将您的命名/可见值映射到二进制值。因此,如果您有一个设置列 user_right:

('Execute', 'Write', 'Read')

它们实际上将存储在服务器后端,如下所示:

(1, 2, 4)

这允许正常查询,例如:

SELECT * FROM user WHERE user_right LIKE '%Write%';

或使用FIND_IN_SET

SELECT * FROM user WHERE FIND_IN_SET('Write',user_right) > 0;

或直接位集操作:

SELECT * from user WHERE user_right & 2;

仅举几例。如果您将 an 添加ORDER BY user_right到您的选择查询中,它会以数字(非字母)顺序返回它们,否则您可以通过以下方式快速确定用户的值:

SELECT user_name, user_right FROM user;

并看到返回值是:

'some user' | Read,Write

同时仍然具有快速过滤的按位运算的好处,例如:

SELECT user_name, user_right FROM user WHERE user_right & ~1;

返回所有具有读写权限但没有执行权限的用户。

于 2013-10-28T21:22:57.977 回答