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

时间:2016-05-06 11:56:26

标签: mysql sql

我有这张桌子:

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

3 个答案:

答案 0 :(得分:3)

您可以将BIT转换为VARCHARCHAR ),然后在以下内容中使用SUBSTR

SELECT SUBSTR(CONVERT(VARCHAR(10),numb), 3, 1) 
FROM numbers

或使用LEFTRIGHT

SELECT LEFT(RIGHT(CONVERT(VARCHAR(10),numb),8),1)
FROM numbers

答案 1 :(得分:2)

如果您有位列,则使用位操作。

记录在案here

一种方法是:

select ( (numb & b'0010000000') > 0)

答案 2 :(得分:2)

虽然转换为substr后可以使用varchar,但BIT(...)数据的更简单方法是使用位运算符输入。

因为根据你的评论,从右边提取第8位是可以的,而不是从左边第三位,这将产生预期的结果:

select id, (x>>7)&1
from test

Demo.

  

我可以只更新其中一个数字吗?我的意思是我想要从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