我有这张桌子:
// numbers
+---------+------------+
| id | numb |
+---------+------------+
| int(11) | bit(10) |
+---------+------------+
| 1 | 1001100111 |
| 2 | 0111000101 |
| 3 | 0001101010 |
| 4 | 1111111011 |
+---------+------------+
现在我正试图从这些数字中获得第三位(从左到右)。例如:
1001100111
^ // I want to get 0
所以这是预期的结果:
+--------------------+
| substr(numb, 3, 1) |
+--------------------+
| 0 |
| 1 |
| 0 |
| 1 |
+--------------------+
这是我的问题:
SELECT SUBSTR(numb, 3, 1) FROM numbers
但它不起作用。因为bit(10)
不是字符串而SUBSTR()
无法解析它。有没有解决方法?
答案 0 :(得分:3)
您可以将BIT
转换为VARCHAR
(或CHAR
),然后在以下内容中使用SUBSTR
:
SELECT SUBSTR(CONVERT(VARCHAR(10),numb), 3, 1)
FROM numbers
或使用LEFT
和RIGHT
:
SELECT LEFT(RIGHT(CONVERT(VARCHAR(10),numb),8),1)
FROM numbers
答案 1 :(得分:2)
答案 2 :(得分:2)
虽然转换为substr
后可以使用varchar
,但BIT(...)
数据的更简单方法是使用位运算符输入。
因为根据你的评论,从右边提取第8位是可以的,而不是从左边第三位,这将产生预期的结果:
select id, (x>>7)&1
from test
我可以只更新其中一个数字吗?我的意思是我想要从
1001011101
更新第七位数字(从右到左)并将其设为0
?
您可以将单个位设置为零,如下所示:
UPDATE test SET x = x & b'1110111111' WHERE id=3
位置0表示您设置为零的位。
如果要将其设置为1
,请使用
UPDATE test SET x = x | b'0001000000' WHERE id=3
如果要将多个位设置为零,则第一个示例中可以有多个零。同样,如果您需要将多个位设置为1
,则第二个示例中可以有多个1
。