【重学 MySQL】十九、位运算符的使用
- 示例
- 检查权限
- 添加权限
- 移除权限
在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。
-
&(位与)
- 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。
-
|(位或)
- 对两个数的二进制表示进行位或操作。只要两个相应的二进制位中有一个为 1,结果的该位就为 1。
-
^(位异或)
- 对两个数的二进制表示进行位异或操作。只有两个相应的二进制位不相同时,结果的该位才为 1,否则为 0。
-
~(位取反)
- 对一个数的二进制表示进行位取反操作。所有的 0 变成 1,所有的 1 变成 0。
-
<<(左移)
- 将一个数的二进制表示向左移动指定的位数。左边超出的位将被丢弃,右边新增的位将用 0 填充。
-
>>(右移)
- 将一个数的二进制表示向右移动指定的位数。符号位(最左边的位)的处理取决于系统是使用算术右移(大多数数据库系统包括 MySQL)还是逻辑右移。算术右移会保留符号位(即如果数是正数,左边新增的位都用 0 填充;如果是负数,则左边新增的位都用 1 填充)。逻辑右移无论正负,左边新增的位都用 0 填充。
示例
假设我们有一个用户表 users
,其中有一个字段 permissions
用于存储用户的权限,权限以位掩码的形式存储。比如,权限 1 表示可以读,权限 2 表示可以写,权限 4 表示可以删除。
检查权限
要检查一个用户是否有写权限(权限 2),可以使用位与操作符:
SELECT * FROM users WHERE (permissions & 2) > 0;
这条 SQL 语句会选出所有 permissions
字段的二进制表示中与 2(即 ...10...
)进行位与操作后结果大于 0 的用户,即那些具有写权限的用户。
添加权限
要给用户添加写权限,可以使用位或操作符:
UPDATE users SET permissions = permissions | 2 WHERE user_id = 1;
这条 SQL 语句将 user_id
为 1 的用户的 permissions
字段与 2 进行位或操作,然后更新回表中。如果原 permissions
为 1(只读),更新后将为 3(可读可写)。
移除权限
移除权限稍微复杂一些,因为需要确保不会影响到其他权限位。这通常需要使用位与和位取反操作符结合使用。比如,要移除写权限(权限 2):
UPDATE users SET permissions = permissions & ~2 WHERE user_id = 1;
这里,~2
首先计算出 2 的位取反值(对于 2 来说是 ...111...1011...
,假设是 32 位整数),然后与原始的 permissions
值进行位与操作,以清除写权限位。
通过熟练使用位运算符,可以高效地处理与位掩码相关的各种场景,特别是在处理权限、状态标记等二进制标志时。