目录
一、日期与时间类型
1.1 date
1.2 datetime
1.3 timestamp
二、枚举和联合
2.1 enum
2.2 set
2.2.1 set 的插入
2.2.2 set 的查找
思维导图可以参考如下链接:
数据类型.xmind · 夜夜亮晶晶/MySQL - Gitee.com
一、日期与时间类型
1.1 date
日期 'yyyy-mm-dd' ,占用三字节
1.2 datetime
时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
1.3 timestamp
时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
按理说, timestamp 应该会自动更新,但是由于 MySQL 版本不一致,可能存在不设置即为NULL的情况,此时可以设置为 列名称 timestamp default current_timestamp
timestamp 列在 MySQL 中的行为可以根据其定义而有所不同:
-
DEFAULT CURRENT_TIMESTAMP
:- 当插入一行数据时,如果没有显式提供
TIMESTAMP
列的值,该列将自动填充为插入操作的时间戳。
- 当插入一行数据时,如果没有显式提供
-
ON UPDATE CURRENT_TIMESTAMP
:- 当行中的其他列被更新时,
TIMESTAMP
列会自动更新为当前时间戳。通常用于跟踪行的最后更新时间。
- 当行中的其他列被更新时,
-
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
:- 这种配置结合了以上两种行为。插入时,
TIMESTAMP
列会自动填充为插入时的时间戳;每次更新该行时,TIMESTAMP
列都会自动更新为当前时间戳。
- 这种配置结合了以上两种行为。插入时,
-
无默认值:
- 如果没有设置默认值或
ON UPDATE
选项,插入或更新时如果未提供值,则该列可能会被填充为NULL
,或者保持原值
- 如果没有设置默认值或
二、枚举和联合
枚举指的是 enum,联合指的是 set,你可能想知道二者的区别,其实 enum 可以看成单选题,set可以看作不定项选择题,第一个是多选一的关系,第二个是多选多或多选一的关系。
具体怎么使用,下面来一起看一下吧!
2.1 enum
枚举 —— 多选一的关系
首先进行建表:
mysql> create table test7(
-> gender enum('男','女'),
-> hobby set('篮球', '足球', '羽毛球', '游泳', '健身', '跑步'));
Query OK, 0 rows affected (0.04 sec)
插入数据:
mysql> insert test7 values('男','足球,羽毛球,游泳');
Query OK, 1 row affected (0.00 sec)
除了上述方法外,enum可以使用下标插入,下标从1开始:
2.2 set
2.2.1 set 的插入
可以看 enum 中插入数据时的方法,
注意:我在首次插入时选择了用C++字符串的格式,每个逗号后跟了一个空格再写数据,这样的格式是不行的! MySQL 的 SET 类型要求插入多个值时,不应将其视为一个完整的字符串,而是使用英文逗号分隔的独立值。
除此之外,enum可以使用下标插入,那么set呢?
set不是使用下标插入,set使用类似位图的概念,将数字转化成二进制,低位到高位依次是set中从前到后的元素:
-
这里解释一下为什么向set中插入的是7但是表中却是篮球足球羽毛球: 首先,建表的时候使用的是 '篮球', '足球', '羽毛球', '游泳', '健身', '跑步' 共六项数据,对应的是比特位的前六位 7转化为二进制是0111,第三位为1对应set中前三个选项。所以是篮球足球羽毛球。
2.2.2 set 的查找
1.如果查找set中只含某项的数据,可以使用
select * from tb_name where column = 'enum类型';
2.如果查找set中含有某项的数据,就涉及到了函数的应用
使用 find_in_set(x, y) ,旨查找 x 是否在 y 集中,这里 x 只能是一个元素,如果查两个元素可以使用两个 find_in_set 用 and 连接
意为查找hobby集合中包含足球的数据
查找hobby集合中既包含足球也包含篮球的数据