本教程将向您介绍如何存储和使用位值的MySQL BIT
数据类型。
MySQL BIT数据类型简介
MySQL提供了允许您存储位值的BIT
类型。BIT(m)
可以存储多达m
位的值,m
的范围在1
到64
之间。
如果省略,默认值为1
。所以下列陈述是一样的:
以及,
要指定一个位值字面值,可使用b'val'
或0bval
来表示,该val
是仅包含0
和1
的二进制值。
开头字符b
可以写成B
,例如,以下两种方式都一样:
上面书写方式都是有效的位字面量。
但是,前导0b
是区分大小写的,所以不能使用0B
。以下是无效的字面值:
默认情况下,位值文字的字符集是二进制字符串,如下所示:
SELECT CHARSET(B''); -- binary
执行结果如下 -
mysql> SELECT CHARSET(B'');
+--------------+
| CHARSET(B'') |
+--------------+
| binary |
+--------------+
1 row in set
MySQL BIT示例
以下语句创建一个名为working_calendar
的新表,其中的列类型和宽度指定为BIT(7)
:
USE testdb;
CREATE TABLE working_calendar(
y INT,
w INT,
days BIT(7),
PRIMARY KEY(y,w)
);
days
列中的值表示工作日或休息日,即1
:表示工作日,0
表示休息日。
假设2017
年第一周的星期六和星期五不是工作日,可以在working_calendar
表中插入一行,如下所示:
INSERT INTO working_calendar(y,w,days)
VALUES(2017,1,B'1111100');
以下查询从working_calendar
表检索数据,结果如下:
SELECT
y, w , days
FROM
working_calendar;
执行上面查询语句,得到以下结果 -
+------+---+---------+
| y | w | days |
+------+---+---------+
| 2017 | 1 | 1111100 |
+------+---+---------+
1 row in set
如上所见,days
列中的位值被转换成一个整数。要将其表示为位值,请使用BIN
函数:
SELECT
y, w , bin(days)
FROM
working_calendar;
执行上面查询语句,得到以下结果 -
+------+---+-----------+
| y | w | bin(days) |
+------+---+-----------+
| 2017 | 1 | 1111100 |
+------+---+-----------+
1 row in set
如果将值插入到长度小于m
位的BIT(m)
列中,MySQL将在位值的左侧使用零填充。
假设第二周的第一天关闭,可以向days
列中插入01111100
值。 但是,111100
的值也可以工作,因为MySQL将使用零填充左侧。
INSERT INTO working_calendar(y,w,days)
VALUES(2017,2,B'111100');
要查看数据,使用与上述相同的查询:
SELECT
y, w , bin(days)
FROM
working_calendar;
执行上面查询语句,得到以下结果 -
+------+---+-----------+
| y | w | bin(days) |
+------+---+-----------+
| 2017 | 1 | 1111100 |
| 2017 | 2 | 111100 |
+------+---+-----------+
2 rows in set
如您所见,MySQL返回结果之前删除了前导零。 要正确显示可以使用LPAD
函数:
SELECT
y, w , lpad(bin(days),7,'0')
FROM
working_calendar;
执行上面查询语句,得到以下结果 -
+------+---+-----------------------+
| y | w | lpad(bin(days),7,'0') |
+------+---+-----------------------+
| 2017 | 1 | 1111100 |
| 2017 | 2 | 0111100 |
+------+---+-----------------------+
2 rows in set
现在工作正常了。
在本教程中,您已经学会了如何使用MySQL BIT
类型来存储位值。