|版权声明:本文为博主原创文章,未经博主允许不得转载。转载请附上原链接,博客地址:https://blog.csdn.net/sgsgy5
1.3 数据类型——枚举(enum)
1、从集合中选择一个数据(单选)
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,以此类推。
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
| 1 |
| 2 |
+-------+
mysql> select sex+0 from t8;
+-------+
| sex+0 |
+-------+
| 1 |
| 2 |
+-------+
3、既然枚举在数据库内部存储的是整数,那么可以直接插入数字
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、 节省空间
思考:已知枚举占用2个字节,请问最多有多少个枚举值?
答:2个字节=16位,可以保存数字(0-65535),枚举是从1开始,所以枚举最多可以有65535个枚举值。
1.4 数据类型——集合(set)
从集合中选择一些数据(多选)
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、…次方
思考:已知集合占用8个字节,最多可以表示几个选项?
答:8个字节=64位,一个位表示1个选项,最多可以表示64个选项。
1.5 数据类型——日期类型
数据类型 | 描述 |
---|---|
datetime | 日期时间,占用8个字节 |
date | 日期 占用3个字节 |
time | 时间 占用3个字节 |
timestamp | 时间戳,占用4个字节 |
year | 年份 占用1个字节 |
1、datetime 格式:年-月-日 小时:分钟:秒
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 日期格式
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范围了。
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之间的年份
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
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支持以天的方式插入
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 |
+-----------+