mysql位操作相关记录
进制间的转换
1.十进制转换成二进制
select bin(5);
1 | mysql>select bin(5) ; |
2.十进制转换成八进制
select oct(5);
1 | mysql>select oct(5); |
3.十进制转换成十六进制
select hex(5);
1 | mysql>select hex(5); |
4.二进制转换成十进制
select conv(‘101’,2,10);
1 | mysql>select conv('101',2,10); |
5.十进制转换成十六进制
select conv(‘20’,10,16);
1 | mysql>select conv('20',10,16); |
位运算
MySQL 中的位运算符
| 运算符 | 说明 | 使用形式 | 举例 |
|---|---|---|---|
| | | 位或 | a | b | 5 | 8 |
| & | 位与 | a & b | 5 & 8 |
| ^ | 位异或 | a ^ b | 5 ^ 8 |
| ~ | 位取反 | ~a | ~5 |
| << | 位左移 | a << b | 5 << 2 |
| >> | 位右移 | a >> b | 5 >> 2 |
位或运算符 |
参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1结果为 1,0|0结果为0,1|0结果为1,这和逻辑运算中的||非常类似。
例 1
使用位或运算符进行正数运算,SQL 语句如下:
1 | mysql> SELECT 10|15,9|4|2; |
10 的补码为 1010,15 的补码为 1111,按位或运算之后,结果为 1111,即整数 15;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位或运算之后,结果为 111,即整数 15。
例 2
使用位或运算符进行负数运算,SQL 语句如下:
1 | mysql> SELECT -7|-1; |
-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位或运算之后,结果为 64 个‘1’,即整数 18446744073709551615。
可以发现,任何数和 -1 进行位或运算时,最终结果都是 -1 的十进制数。
位与运算符 &
参与&运算的两个二进制位都为 1 时,结果就为 1,否则为 0。例如1|1结果为 1,0|0结果为 0,1|0结果为 0,这和逻辑运算中的&&非常类似。
例 3
使用位与运算符进行正数运算,SQL 语句如下:
1 | mysql> SELECT 10 & 15,9 & 4 & 2; |
10 的补码为 1010,15 的补码为 1111,按位与运算之后,结果为 1010,即整数 10;9 的补码为 1001,4 的补码为 0100,2 的补码为 0010,按位与运算之后,结果为 0000,即整数 0。
例 4
使用位与运算符进行负数运算,SQL 语句如下:
1 | mysql> SELECT -7&-1; |
-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位与运算之后,结果为 60 个‘1’加 1001,即整数 18446744073709551609。
可以发现,任何数和 -1 进行位与运算时,最终结果都为任何数本身的十进制数。
位异或运算符 ^
参与^运算的两个二进制位不同时,结果为 1,相同时,结果为 0。例如1|1结果为 0,0|0结果为 0,1|0结果为1。
例 5
使用位异或运算符进行正数运算,SQL 语句如下:
1 | mysql> SELECT 10^15,1^0,1^1; |
10 的补码为 1010,15 的补码为 111,按位异或运算之后,结果为 0101,即整数 5;1 的补码为 0001,0 的补码为 0000,按位异或运算之后,结果为 0001;1 和 1 本身二进制位完全相同,因此结果为 0。
例 6
使用位异或运算符进行负数运算,SQL 语句如下:
1 | mysql> SELECT -7^-1; |
-7 的补码为 60 个‘1’加 1001,-1 的补码为 64 个‘1’,按位异或运算之后,结果为 110,即整数 6。
位左移运算符 <<
位左移是按指定值的补码形式进行左移,左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用 0 补齐。
位左移的语法格式为:expr << n
其中,n 指定值 expr 要移位的位数,n 必须为非负数。
例 7
使用位左移运算符进行正数计算,SQL 语句如下:
1 | mysql> SELECT 1<<2,4<<2; |
1 的补码为 0000 0001,左移两位之后变成 0000 0100,即整数 4;4 的补码为 0000 0100,左移两位之后变成 0001 0000,即整数 16。
例 8
使用位左移运算符进行负数计算,SQL 语句如下:
1 | mysql> SELECT -7<<2; |
-7 的补码为 60 个‘1’加 1001,左移两位之后变成 56 个‘1’加 1110 0100,即整数 18446744073709551588。
位右移运算符 >>
位右移是按指定值的补码形式进行右移,右移指定位数之后,右边低位的数值被移出并丢弃,左边高位空出的位置用 0 补齐。
位右移语法格式为:expr >> n
其中,n 指定值 expr 要移位的位数,n 必须为非负数。
例 9
使用位右移运算符进行正数运算,SQL 语句如下:
1 | mysql> SELECT 1>>1,16>>2; |
1 的补码为 0000 0001,右移 1 位之后变成 0000 0000,即整数 0;16 的补码为 0001 0000,右移两位之后变成 0000 0100,即整数 4。
例 10
使用位右移运算符进行负数运算,SQL 语句如下:
1 | mysql> SELECT -7>>2; |
-7 的补码为 60 个‘1’加 1001,右移两位之后变成 0011 加 56 个‘1’加 1110,即整数 4611686018427387902。
位取反运算符 ~
位取反是将参与运算的数据按对应的补码进行反转,也就是做 NOT 操作,即 1 取反后变 0,0 取反后变为 1。
例 11
下面看一个经典的取反例子,对 1 进行位取反运算,具体如下所示:
1 | mysql> SELECT ~1,~18446744073709551614; |
常量 1 的补码为 63 个‘0‘加 1 个’1‘,位取反后就是 63 个’1‘加一个’0‘,转换为二进制后就是 18446744073709551614。
可以使用 BIN() 函数查看 1 取反之后的结果,BIN() 函数的作用是将一个十进制数转换为二进制数,SQL 语句如下:
1 | mysql> SELECT BIN(~1); |
1 的补码表示为最右边位为 1,其他位均为 0,取反操作之后,除了最低位,其他位均变为 1。
例 12
使用位取反运算符进行运算,SQL 语句如下:
1 | mysql> SELECT 5 & ~1; |
逻辑运算5&1 中,由于位取反运算符‘’的级别高于位与运算符‘&’,因此先对 1 进行取反操作,结果为 63 个‘1’加一个‘0’,然后再与整数 5 进行与运算,结果为 0100,即整数 4。