当前位置:   article > 正文

mysql位运算_mysql位运算 数据库设计及应用

位运算 数据库

1. 基本概念

如果你不知道什么是位运算的话, 那么请你先去看看基础的C语言教程吧。

与运算 a & b ,

或运算 a | b ,

异或运算 a ^ b ,

或者

你也可以将 与运算理解为 + 法

例如

1|2 = 3 (1+2 = 3)

1|2|4 = 7 (1+2+4 = 7)

将 异或运算理解为 - 法

例如

3^2 = 1 (3-2 = 1)

3^1 = 2 (3-1 = 2)

最后将 与运算 作为判断

例如

3&2 = 1 (3 = 1 + 2, 由 1和2组成 ,所以判断3&2 = 1 )

3&4 = 0 ( 3 没有由 4组成,所以判断3&4 = 0)

那么位运算有何用处呢, 例如 UNIX系统中的权限, 通常我们所知 权限分为 r 读, w 写, x 执行,其中 它们的权值分别为4,2,1, 所以 如果用户要想拥有这三个权限 就必须 chomd 7 , 即 7=4+2+1 表明 这个用户具有rwx权限,如果只想这个用户具有r,x权限 那么就 chomd 5即可

说道此处就要涉及到数据库了。

通常 我们的数据表中 可能会包含各种状态属性, 例如 blog表中 , 我们需要有字段表示其是否公开,是否有设置密码,是否被管理员封锁,是否被置顶等等。 也会遇到在后期运维中,策划要求增加新的功能而造成你需要增加新的字段。

这样会造成后期的维护困难,数据库增大,索引增大的情况。 这时使用位运算就可以巧妙的解决。

例如

define('B_PUBLIC',1); // 公开

define('B_PASSWORD',2); // 加密

define('B_LOCK',4); // 封锁

define('B_TOP',8); // 置顶

?>

-- 公开blog 给status进行或运算

UPDATE blog SET status = status | 1;

-- 加密blog 给status进行或运算

UPDATE blog SET status = status | 2;

-- 封锁blog

UPDATE blog SET status = status | 4;

-- 解锁blog

UPDATE blog SET status = status ^ 4;

--查询所有被置顶的blog

SELECT * FROM blog WHERE status & 8;

虽然节省了空间,但是由于没有办法对status字段使用索引(读者可以自己试下能否使用索引),所以如何使用来优化查询才是最重点的。

2. 在权限中的使用

需要建立两张表:

第一张表:所拥有的权限 righttags

-- 表的结构 `righttags`

CREATE TABLE IF NOT EXISTS `righttags` (

`Pkid` int(10) unsigned NOT NULL AUTO_INCREMENT,

`RightsName` varchar(20) CHARACTER SET utf8 NOT NULL,

`RightsTag` int(10) NOT NULL,

PRIMARY KEY (`Pkid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

-- 转存表中的数据 `righttags`

INSERT INTO `righttags` (`Pkid`, `RightsName`, `RightsTag`) VALUES

(1, '吃饭', 1),

(2, '拉屎', 2),

(3, '打炮', 4),

(4, '泡妞', 8),

(5, '生子', 16),

(6, '包二奶', 32);

第二张表:用户信息表 rightusers

-- 表的结构 `rightusers`

CREATE TABLE IF NOT EXISTS `rightusers` (

`Pkid` int(10) NOT NULL AUTO_INCREMENT,

`Fuser` varchar(30) CHARACTER SET utf8 NOT NULL,

`UserRights` int(10) NOT NULL,

PRIMARY KEY (`Pkid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-- 转存表中的数据 `rightusers`

INSERT INTO `rightusers` (`Pkid`, `Fuser`, `UserRights`) VALUES

(1, '张三', 7),

(2, '李四', 9),

(3, '王老板', 63),

(4, '朱麻子', 0);

2.1 访问判断是否有权限

获取所有可以“打炮”的人

SELECT `RightTags` FROM `righttags` WHERE `RightsName` = "打炮";   (查出RightTags是4)

SELECT * FROM RightUsers WHERE UserRights &4 =4;

此人是否可以打炮(有无记录集)

SELECT `RightTags` FROM `righttags` WHERE `RightsName` = "打炮";    (查出RightTags是4)

select * from RightUsers where FUser='李四' and UserRights&4=4     (没有结果集)

select * from RightUsers where FUser='张三' and UserRights&4=4     (有结果集)

2.2 设置权限

SELECT sum( RightsTag ) FROM RightTags WHERE RightsName IN ('吃饭', '拉屎', '打炮'); (首先查看需要设置权限的总和是 7)

update RightUsers set UserRights=7 where FUser='张三'; (更改张三用户的权限)

2.3 查看某人的所有权限

SELECT UserRights FROM RightUsers WHERE FUser = '李四';   (首先查看李四用户的权限值是 9)

SELECT * FROM RightTags WHERE 9 & RightsTag = RightsTag;  (再查看李四的所拥有的权限集:"吃饭","泡妞")

参考地址:

sqlserver位操作   http://luanxiyuan.iteye.com/blog/1935113

mysql位其他操作   http://blog.sae.sina.com.cn/archives/3506  (注意该文的最后一个查询博主写错了)

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/978915
推荐阅读
相关标签
  

闽ICP备14008679号