前言
隔着玻璃门,看着面试官缓缓走来,头上飘着几根白发,在行走中随风摇曳,看的让人有一种想帮他薅下来的冲动。
这次面试的岗位是数据库数据类型,面试官坐下来冲着面试者沐风晓月呵呵一笑, “来啦”!
虽是简单的两个字,但还是让晓月感觉到一丝震慑,仿佛一股真气扑面而来。
此人功力不浅,晓月把简历递了上去:“你好面试官,我是来面试的,这是我的简历”
面试官没有接简历,只是轻轻点了下头,示意晓月把简历放到桌子上,缓缓道“你的情况我基本了解了,一面的面试官都已经给我说了,不知道你对数据库了不了解,比如你对MySQL数据类型了解多少。”
晓月松了一口气,多亏来面试的时候看过,内心竟然有一些窃喜,自从穿越到这个星球以来,晓月第一次感觉到如此放松。
接着晓月起身,拉过白板,根据上一世对数据库的记忆,开始阐述他对数据类型的理解
一. 关于MySQL数据类型
在官网上MySQL支持将近39种数据类型,常用的大致可以分为三类:数值、日期/时间和字符串(字符)类型。
1. 数值类型
数值类型就包含了整数类型和浮点数类型:
关于数值类型,我在这里画了一个表:
这里的有符号和无符号在MySQL中用于定义数值型数据类型的范围。 他们之间有如下区别:
- 有符号(Signed):有符号的数值类型可以表示正数、负数和零。这意味着你可以在有符号数值类型中存储正数和负数的值,包括零。例如,有符号的 TINYINT 类型可以存储范围从 -128 到 127 的值,其中负数和零也是有效的。
- 无符号(Unsigned):无符号的数值类型只能表示非负数(即正数和零),不能存储负数的值。无符号类型扩展了数据类型的上限,因为它们不需要一个位表示符号。例如,无符号的 TINYINT 类型可以存储范围从 0 到 255 的值。
比如tinyint 类型, 占一个字节,有符号-128到127 无符号位 0-255
如果一个人的年龄是0-100 ,理论上就可以使用tinyint 无符号范围,0-255 足够用了, 而且占得字节数比较少。
我们来看一个例子,晓月在白板上写道:
# 创建一个表tab1 ,设置三个不同类型的字段
mysql> create table tab1(t1 TINYINT, t2 SMALLINT,t3 BIGINT);
Query OK, 0 rows affected (0.04 sec)
mysql> DESC tab1;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| t1 | tinyint | YES | | NULL | |
| t2 | smallint | YES | | NULL | |
| t3 | bigint | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
# 当插入数值超过的数据类型的范围就会报错。
mysql> insert into tab1(t1) values(-128),(127),(12),(356);
ERROR 1264 (22003): Out of range value for column 't1' at row 4
mysql>
可以看到,这里的356,就已经超出了范围,所以直接提示超出了范围。
2. 日期和时间类型
DATE:用于存储日期值,格式为’YYYY-MM-DD’。
示例:‘2021-09-15’
TIME:用于存储时间值,格式为’HH:MM:SS’。
示例:‘12:30:45’
DATETIME:用于存储日期和时间值,格式为’YYYY-MM-DD HH:MM:SS’。
示例:‘2021-09-15 12:30:45’
TIMESTAMP:用于存储日期和时间值,格式为’YYYY-MM-DD HH:MM:SS’。与DATETIME相似,但它在插入或更新时自动设置为当前时间戳。
示例:‘2021-09-15 12:30:45’
YEAR:用于存储年份值,格式为’YYYY’。
示例:‘2021’
INTERVAL:用于表示时间间隔的数据类型,可以用于执行日期和时间操作。
示例:INTERVAL ‘5’ DAY,表示5天的时间间隔。
在一个秒杀活动中,可以使用时间类型来记录和处理活动的开始时间、结束时间以及参与者的下单时间。以下是一个使用时间类型的示例:
seckill_activity 表用于存储秒杀活动的信息
MySQL [school]> create table seckill_activity(
-> id int ,
-> name varchar(50),
-> start_time DATETIME,
-> end_tim DATETIME
-> );
Query OK, 0 rows affected (0.01 sec)
3. 字符串类型
MySQL [mufenggrow]> create table users(
-> id int,
-> name varchar(50),
-> email varchar(100)
-> );
Query OK, 0 rows affected (0.00 sec)
MySQL [mufenggrow]> INSERT INTO users (id, name, email)
-> VALUES (1, 'John Doe', 'john@example.com'),
-> (2, 'Jane Smith', 'jane@example.com');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL [mufenggrow]>
当然如果要总结下的话,可以做个思维导图:
二. 面试官提问环节
当沐风晓月讲解完后,面试官轻轻地微笑了一下,随后轻轻点了点头,示意晓月坐下后,缓缓道:“接下来我问你几个问题”。
1. char 和varchar的区别是什么?
答: 从三个方面来说:
-
存储方式:CHAR类型是固定长度的,它会分配固定大小的存储空间,无论实际存储的字符串长度是多少,都会占用固定的空间。而VARCHAR类型是可变长度的,它只会分配实际存储的字符串长度所需的空间,不会浪费额外的空间。
-
适用场景:由于CHAR类型是固定长度的,适合存储长度固定的字符串,例如存储邮政编码或电话号码等。而VARCHAR类型适合存储长度不固定的字符串,例如存储用户的姓名或地址等。
-
存储效率:由于CHAR类型在存储时会占用固定的空间,所以对于读取和存储固定长度的字符串来说,它的效率通常会稍微高一些。而对于长度不固定的字符串来说,VARCHAR的存储效率会更高,因为它只分配实际需要的空间,不浪费额外的存储空间。
另外:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),
所以varchar(4),存入3个字符将占用4个字节。
区别如图:
2. 浮点型有哪些?
答: 浮点型主要有 float,double 两个,浮点型在数据库中存放的是近似值,例如float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位,整数部分最大是3位。
当然浮点型float 和 double 平时用的不太多。
3. MySQL数据类型的选择上你有什么建议
答: 当一个列可以选择多种数据类型时, 应该优先考虑数字类型, 其次是日期或者二进制类型, 最后才是字符类型. 对于相同级别的数据类型, 应该优先选择占用空间小的数据类型
数字类型> 日期或二进制类型 > 字符类型
面试官看着滔滔不绝的晓月,按了暂停键,眉宇间带着微笑,仿佛要把晓月收为弟子一样, “回答的很好,我们今天先到这吧,另外我把这本云原生成长手册的武林绝学送给你,回去之后一定要仔细研读”
“好的,谢谢面试官”,晓月接过书来,道谢后,召唤来七彩祥云,从窗户飘然而去。
总结
晓月回到家,喜忧参半, 喜的是总算能答对一次面试了,忧的是云原生领域技术栈这么多,自己刚刚穿越而来,学起来也有些吃力,算了先睡一觉吧,回头把面试官提的几个问题发到博客,也算对知识的一种总结嘛