数据库基本操作6

1.3 数据类型——枚举(enum)

1、从集合中选择一个数据(单选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> create table t8(
-> name varchar(20),
-> sex enum('男','女','保密') # 枚举
-> )charset=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t8 values ('tom','男');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values ('berry','女');
Query OK, 1 row affected (0.05 sec)

mysql> insert into t8 values ('rose','未知'); # 报错,只能插入枚举值
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> select * from t8;
+-------+------+
| name | sex |
+-------+------+
| tom | 男 |
| berry | 女 |
+-------+------+

2、MySQL的枚举类型是通过整数来管理的,第一个值是1,第二个值是2,以此类推。

1
2
3
4
5
6
7
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
| 1 |
| 2 |
+-------+
1
2
3
4
5
6
7
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
| 1 |
| 2 |
+-------+

3、既然枚举在数据库内部存储的是整数,那么可以直接插入数字

1
2
3
4
5
6
7
8
9
10
11
12
mysql> insert into t8 values ('rose',3);  # 可以直接插入数字
Query OK, 1 row affected (0.00 sec)

mysql> select * from t8;
+-------+------+
| name | sex |
+-------+------+
| tom | 男 |
| berry | 女 |
| rose | 保密 |
+-------+------+
3 rows in set (0.00 sec)

枚举的优点:

1、 运行速度快(数字比字符串运算速度快)

2、 限制数据,保证数据完整性

3、 节省空间

1
2
3
思考:已知枚举占用2个字节,请问最多有多少个枚举值?

答:2个字节=16位,可以保存数字(0-65535),枚举是从1开始,所以枚举最多可以有65535个枚举值。

1.4 数据类型——集合(set)

从集合中选择一些数据(多选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> create table t9(
-> hobby set('爬山','读书','游泳','敲代码')
-> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into t9 values ('爬山');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values ('爬山,游泳');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values ('游泳,爬山'); # 插入顺序不一样,但是显示的顺序是一样的
Query OK, 1 row affected (0.02 sec)

mysql> insert into t9 values ('爬山,游泳,开车'); # 报错,插入集合中没有的选项会报错
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1

每个集合的元素都分配一个固定的数字,分配的方式从左往右按2的0、1、2、…次方

1
2
3
思考:已知集合占用8个字节,最多可以表示几个选项?

答:8个字节=64位,一个位表示1个选项,最多可以表示64个选项。

1.5 数据类型——日期类型

数据类型 描述
datetime 日期时间,占用8个字节
date 日期 占用3个字节
time 时间 占用3个字节
timestamp 时间戳,占用4个字节
year 年份 占用1个字节

1、datetime 格式:年-月-日 小时:分钟:秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> create table t10(
-> field datetime
-> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t10 values ('2025-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t10 values ('100-10-12 10:12:36');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t10 values ('10000-10-12 10:12:36'); #datetime保存范围是:1~9999年
ERROR 1292 (22007): Incorrect datetime value: '10000-10-12 10:12:36' for column 'field' at row 1

mysql> select * from t10;
+---------------------+
| field |
+---------------------+
| 2025-10-12 10:12:36 |
| 0100-10-12 10:12:36 |
+---------------------+
2 rows in set (0.00 sec)

2、date 日期格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> create table t11(
-> field date
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values ('2025-10-12');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;
+------------+
| field |
+------------+
| 2025-10-12 |
+------------+

3、timestamp:时间戳

timestamp类型和 datetime类型在表现上是一样的。他们的区别:
datetime是从1到9999,而timestamp从1970年~2038年,2038年01月19日11:14:07秒以后就超出timestamp范围了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> create table t12(
-> field timestamp
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t12 values ('1975-5-5 12:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t12 values ('1969-5-5 12:12:12'); # 超出范围
ERROR 1292 (22007): Incorrect datetime value: '1969-5-5 12:12:12' for column 'field' at row 1
mysql> insert into t12 values ('2038-1-19 11:14:07');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t12 values ('2038-1-19 11:14:08'); # 超出范围
ERROR 1292 (22007): Incorrect datetime value: '2038-1-19 11:14:08' for column 'field' at row 1

mysql> select * from t12;
+---------------------+
| field |
+---------------------+
| 1975-05-05 12:12:12 |
| 2038-01-19 11:14:07 |
+---------------------+

4、year

因为只占用1个字节,最多只能表示255个年份,范围是1901-2155之间的年份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> create table t13(
-> field year
-> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t13 values (2025);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t13 values (1900); # 超出范围
ERROR 1264 (22003): Out of range value for column 'field' at row 1
mysql> insert into t13 values (2155);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t13 values (2156); # 超出范围
ERROR 1264 (22003): Out of range value for column 'field' at row 1

5、time 表示时间或时间间隔,范围是-838:59:59~838:59:59

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> create table t14(
-> field time
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t14 values ('12:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('212:12:12');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('838:59:59');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t14 values ('839:00:00'); # 操作范围
ERROR 1292 (22007): Incorrect time value: '839:00:00' for column 'field' at row 1
mysql>

多学一招:time支持以天的方式插入

1
2
3
4
5
6
7
8
9
10
11
12
mysql> insert into t14 values ('10 10:10:10');
Query OK, 1 row affected (0.02 sec)

mysql> select * from t14;
+-----------+
| field |
+-----------+
| 12:12:12 |
| 212:12:12 |
| 838:59:59 |
| 250:10:10 |
+-----------+
-------------本文结束感谢您的阅读-------------

本文标题:数据库基本操作6

文章作者:Wuman

发布时间:2018年09月12日 - 14:09

最后更新:2018年09月12日 - 13:09

原始链接:http://yoursite.com/2018/09/12/数据库基本操作6/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。