我有这张桌子:
// numbers
+---------+------------+
| id | numb |
+---------+------------+
| int(11) | bit(10) |
+---------+------------+
| 1 | 1001100111 |
| 2 | 0111000101 |
| 3 | 0001101010 |
| 4 | 1111111011 |
+---------+------------+
Run Code Online (Sandbox Code Playgroud)
现在我想从这些数字中获得第三位数(从左到右).例:
1001100111
^ // I want to get 0
Run Code Online (Sandbox Code Playgroud)
所以预期的结果是:
+--------------------+
| substr(numb, 3, 1) |
+--------------------+
| 0 |
| 1 |
| 0 |
| 1 |
+--------------------+
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
SELECT SUBSTR(numb, 3, 1) FROM numbers
Run Code Online (Sandbox Code Playgroud)
但它不起作用.因为bit(10)不是字符串而SUBSTR()无法解析它.有没有解决方法?
substr尽管您可以在转换为 后使用varchar,但数据类型的更简单方法BIT(...)是使用位运算符。
由于根据您的评论,可以从右侧提取第 8 位,而不是从左侧提取第三位,这将产生预期的结果:
select id, (x>>7)&1
from test
Run Code Online (Sandbox Code Playgroud)
我可以只更新其中一位数字吗?我的意思是我想更新第七位数字(从右到左)
1001011101并使其成功0?
您可以将一位设置为零,如下所示:
UPDATE test SET x = x & b'1110111111' WHERE id=3
Run Code Online (Sandbox Code Playgroud)
0 的位置表示您要设置为零的位。
如果您想将其设置为1,请使用
UPDATE test SET x = x | b'0001000000' WHERE id=3
Run Code Online (Sandbox Code Playgroud)
如果您想将多个位设置为零,则在第一个示例中可以有多个零。同样,1如果您需要将多个位设置为 ,则在第二个示例中可以有多个位1。