如何对BIT(...)数据类型列使用substr(...)?

sta*_*ack 6 mysql sql

我有这张桌子:

// 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()无法解析它.有没有解决方法?

das*_*ght 2

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