MySQL BIT 数据类型介绍

在本文中,我们将带您了解 MySQL 中的 BIT 数据类型以及如何使用 BIT 数据类型存储状态值。

在 MySQL 中 BIT 数据类型被用来存储二进制的位值。我们通常使用 BIT 数据类型的列存储状态值,比如布尔值等。 BIT 数据类型也是易于扩展的。

MySQL BIT 语法

当我们使用 BIT 数据类型时,需要指定一个位数参数。这是语法:

BIT(M)

这里:

  • BIT(M) 允许存储 M 位值。 M 的取值范围是 164
  • 如果不指定 M,那么它的默认值为 1BIT 等效于 BIT(1)

BIT 字面值

当我们需要向 BIT 列中插入 BIT 值时,需要使用 BIT 字面量。 BIT 字面量可以使用如下格式:

  • b'val'
  • B'val'
  • 0bval

这里 val 是二进制值,它仅包含 01。例如:

b'01'
B'01'
0b01

注意,前导 bB 是等效的。但是 0b 是正确的前导符号,而 0B 不是正确的前导符号。下面是几个不正确的 BIT 字面值:

b'2'    -- 2 不是正确的 2 进制数
0B01    -- 不能用 0B 前导,应使用 0b

MySQL BIT 实例

BIT 列非常适合用来存储状态值。在下例子中,我们将创建一个订单状态表 order_state,表中包含了一个用来存储订单状态的 state 列。我们先预设订单有如下状态:

状态 状态十进制值 状态二进制值
待支付 0 000
已支付 1 001
待发货 2 010
已发货 3 011
已完成 4 100

二进制值最大位数是 3 位,那么 state 列的数据类型可以使用 state BIT(3)

我们使用下面的 sql 语句创建表

CREATE TABLE order_state (
  order_id INT NOT NULL PRIMARY KEY,
  state BIT(3) NOT NULL
);

插入 BIT

现在,让我我们插入一条状态为 3 的行,我们可以使用 3, b'011', B'011', 0b011 其中的任意一个。如下:

INSERT INTO order_state (order_id, state)
VALUES (1, 3),
       (2, b'011'),
       (3, B'011'),
       (4, 0b011);

现在让我通过以下 SQL 查询 order_state 表中的所有行:

SELECT * FROM order_state;
+----------+--------------+
| order_id | state        |
+----------+--------------+
|        1 | 0x03         |
|        2 | 0x03         |
|        3 | 0x03         |
|        4 | 0x03         |
+----------+--------------+

展示 BIT 列值

如果我们想让输出结果更可读一些,可以使用如下函数或者表达式转为其他进制显示:

  • BIN() 转为二进制
  • OCT() 转为八进制
  • HEX() 转为十六进制
  • state+0 转为十进制
SELECT order_id,
  state + 0,
  BIN(state),
  OCT(state),
  HEX(state)
FROM order_state;
+----------+---------+------------+------------+------------+
| order_id | state+0 | BIN(state) | OCT(state) | HEX(state) |
+----------+---------+------------+------------+------------+
|        1 |       3 | 11         | 3          | 3          |
|        2 |       3 | 11         | 3          | 3          |
|        3 |       3 | 11         | 3          | 3          |
|        4 |       3 | 11         | 3          | 3          |
+----------+---------+------------+------------+------------+

这里,我们将 state 分别以 十进制、二进制、八进制、十六进制输出出来。

BIT 列作为过滤条件

如果我们使用 BIT 列作为 WHERE 子句中的过滤条件,可以直接使用其对应的十进制或者 BIT 字面值。如下:

SELECT * FROM order_state WHERE state = 3;
SELECT * FROM order_state WHERE state = (3);
SELECT * FROM order_state WHERE state = b'011';
SELECT * FROM order_state WHERE state = B'011';
SELECT * FROM order_state WHERE state = 0b011;

结论

在本文中,我们带您了解 MySQL 中的 BIT 数据类型以及如何使用 BIT 数据类型存储状态值。

  • BIT 数据类型用来存储二进制的位值,它适合用来存储状态值。
  • BIT(M) 允许存储 M 位值。 M 的取值范围是 164
  • 如果不指定 M,那么它的默认值为 1BIT 等效于 BIT(1)