首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL和Bit击打

MySQL和Bit击打
EN

Stack Overflow用户
提问于 2013-10-28 20:44:06
回答 1查看 90关注 0票数 1

我在SQL上使用钻头撞击作为用户权限,就像UNIX权限一样:

1-001-执行 2- 010 -写 4- 100读

因此,如果我有权利6( 2+4或110),我可以写和读,但我不能执行。在我的情况下,我有更多的权利,所以我的用户可以有价值"128“的权利。

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

代码语言:javascript
复制
SELECT * from user WHERE user_right ?? '2'

使用者的权利必须是2 (010),3 (011),6 (110)或7 (111) ?!

谢谢大家,为我的英语道歉:/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-28 21:22:57

128意味着共有7项用户权利:

代码语言:javascript
复制
1 1 1 1 1 1 1 = 0177 = 0x7F = 127

MySQL已经为其提供了一个抽象,称为类型,它本质上将您的命名/可见值映射为一个二进制值。因此,如果您有一个set列user_right:

代码语言:javascript
复制
('Execute', 'Write', 'Read')

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

代码语言:javascript
复制
(1, 2, 4)

这允许正常的查询,例如:

代码语言:javascript
复制
SELECT * FROM user WHERE user_right LIKE '%Write%';

或者使用FIND_IN_SET

代码语言:javascript
复制
SELECT * FROM user WHERE FIND_IN_SET('Write',user_right) > 0;

或直接位集操作:

代码语言:javascript
复制
SELECT * from user WHERE user_right & 2;

举几个例子。如果将ORDER BY user_right添加到select查询中,它将按数字(而不是字母顺序)返回查询,但否则您可以通过以下方式快速确定用户的值:

代码语言:javascript
复制
SELECT user_name, user_right FROM user;

并且看到返回的值是:

代码语言:javascript
复制
'some user' | Read,Write

虽然仍然可以使用按位操作进行非常快速的筛选,例如:

代码语言:javascript
复制
SELECT user_name, user_right FROM user WHERE user_right & ~1;

若要返回所有没有执行权限的读取和写入权限的用户,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19644743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档