学生基本信息表
学号 | 姓名 | 性别 | 身份证号 | 学院 | 专业 | 入学时间 |
---|---|---|---|---|---|---|
20180101 | 杜子腾 | 男 | 158177199901044792 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180102 | 杜琦燕 | 女 | 151008199801178529 | 计算机学院 | 计算机科学与工程 | 2018-09-01 |
20180103 | 范统 | 男 | 17156319980116959X | 计算机学院 | 软件工程 | 2018-09-01 |
20180104 | 史珍香 | 女 | 141992199701078600 | 计算机学院 | 软件工程 | 2018-09-01 |
20180105 | 范剑 | 男 | 181048200008156368 | 航天学院 | 飞行器设计 | 2018-09-01 |
20180106 | 朱逸群 | 男 | 197995199801078445 | 航海学院 | 电子信息 | 2018-09-01 |
表里的一行就代表一个学生的基本信息,这一行中的某一列就代表这个学生基本信息中的一项属性,也就是说学号
是学生的一项属性、姓名
也是学生的一项属性,其他的列也都是这个学生的属性。但是这些属性都有一定格式,比如说学号必须是整数格式的,入学时间必须是日期格式的,其他的属性都是字符串格式的,不同格式的数据是不能随便乱填的,你把一个日期格式的数据填在了性别里,岂不是闹出了笑话。所以设计MySQL
的大叔们针对属性的不同格式定义了不同的数据类型,我们接下来就要详细唠叨MySQL
中具体有哪些数据类型。
小贴士: 身份证号由于最后一位可能是X,所以就归为字符串了。
数值类型
整数类型
进制
long long ago,原始人是没有现在的人这么聪明的,只会用十分简单的东西计数。比方说他们只会使用麦秆来统计猎物数量,每收获一个猎物就在麦秆堆里添加一支麦秆,所以如果猎物多的话,麦秆就会累积很多,数都数不过来。后来人们发现不用这么笨,可以把麦秆折叠成不同的形状来代表不同的数量。普通的麦秆就代表1,也就是说每添加一只猎物就多放一只普通麦秆;如果当前已经放了9根普通的麦秆,此时再添加了一只猎物,就用一个心形麦秆来取代之前的9根普通麦秆;假如当前已经有了9根心形麦秆和9根普通麦秆时又添加了一只猎物的话,就用一根矩形麦秆来替代之前所有的麦秆。像这种每逢10个数向前进一位的计数方法就叫做十进制,这样他们就可以用很少的麦秆来表示很大的数字了。
如果在计数的时候每逢8个数就往前进一位就是八进制,每逢9个数就往前进一位就是九进制。生活中常用的进制除了十进制外,还有钟表里用来统计时间的十二进制和六十进制,用在计算机里的二进制和十六进制。 以十进制数字109
为例,它表示有1个10²
,加0个10¹
,加9个10⁰
,用数学符号表示就是:
109 = 1 × 10² + 0 × 10¹ + 9 × 10⁰
这个数字也可以这么表示:
109 = 1 × 8² + 5 × 8¹ + 5 × 8⁰
也就是从八进制的逢8进一的角度上考虑,这个数可以被表示为155
(八进制)。当然这个数也可以这么写:
109 = 1 × 2⁶ + 1 × 2⁵ + 0 × 2⁴ + 1 × 2³ + 1 × 2² + 0 × 2¹ + 1 × 2⁰
也就是从二进制的逢2进一的角度上考虑,这个数也可以被表示为:1101101
(二进制)。又因为计算机中8个比特位代表一个字节
,平时都是用若干个字节来表示一个整数,假如用1个字节表示109
的话,那效果就是这样:01101101
(二进制),假如用两个字节表示十进制数109
的话,那效果就是这样:0000000001101101
(二进制)。
MySQL的整数类型
很显然,使用的字节数越多,意味着能表示的数值范围就越大,但是也就越耗费存储空间。根据表示一个数占用字节数的不同,MySQL
把整数划分成如下所示的类型:
类型 | 占用的存储空间(单位:字节) | 无符号数取值范围 | 有符号数取值范围 | 含义 |
---|---|---|---|---|
TINYINT |
1 | 0 ~ 2⁸-1 | -2⁷ ~ 2⁷-1 | 非常小的整数 |
SMALLINT |
2 | 0 ~ 2¹⁶-1 | -2¹⁵ ~ 2¹⁵-1 | 小的整数 |
MEDIUMINT |
3 | 0 ~ 2²⁴-1 | -2²³ ~ 2²³-1 | 中等大小的整数 |
INT (别名:INTEGER ) |
4 | 0 ~ 2³²-1 | -2³¹ ~ 2³¹-1 | 标准的整数 |
BIGINT |
8 | 0 ~ 2⁶⁴-1 | -2⁶³ ~ 2⁶³-1 | 大整数 |
以TINYINT
为例,用1个字节,也就是8个位表示有符号数
的话,就是既可以表示正数,也可以表示负数的话,需要有一个比特位表示正负号。但是如果表示无符号数
的话,也就是只表示非负数的话,就不需要表示正负号,这是有符号数
和无符号数
的区别。具体每个类型的取值范围是如何计算出来的我们这就不唠叨了,可以找一本计算机基础的书看看。
小贴士: 如果觉得讲解计算机基础的书籍太过晦涩,没关系,等我~
浮点数类型
用二进制表示十进制小数
浮点数是用来表示小数的,我们平时用的十进制小数也可以被转换成二进制后被计算机存储。比如9.875
,这个小数可以被表示成这样:
9.875 = 8 + 1 + 0.5 + 0.25 + 0.125 = 1 × 2³ + 1 × 2⁰ + 1 × 2⁻¹ + 1 × 2⁻² + 1 × 2⁻³
也就是说,如果十进制小数9.875
转换成二进制小数的话就是:1001.111
。为了在计算机里存储这种二进制小数,我们统一把它们表示成a × 2ⁿ
的科学计数法的形式,其中1≤|a|
<2,比如1001.111
可以被表示成1.001111 × 2³
,我们把小数点之后的001111
称为尾数
,把2³
中的3
称为指数
,然后只需要在计算机中的比特位中表示出尾数
和指数
就行了。另外,小数也有正负之分,我们还需要单独的部分来表示小数的正负号。综上所述,表示一个浮点数需要下边几个部分:
-
符号部分,占用1个比特位即可。
-
指数部分,视具体浮点数格式而定。
-
尾数部分,视具体浮点数格式而定。
MySQL的浮点数类型
很显然,我们表示一个浮点数使用的字节数越多,表示尾数
和指数
的范围就越大,也就是说可以表示的小数范围就越大,设计MySQL
的大叔根据表示一个小数需要的不同字节数定义了如下的两种浮点数类型:
类型 | 占用的存储空间(单位:字节) | 绝对值最小非0值 | 绝对值最大非0值 | 含义 |
---|---|---|---|---|
FLOAT |
4 | ±1.175494351E-38 | ±3.402823466E+38 | 单精度浮点数 |
DOUBLE |
8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 | 双精度浮点数 |
以单精度浮点数类型FLOAT
类型为例,它占用的4个字节的各个组成部分如下图所示:
另外需要注意的是,虽然有的十进制小数,比如1.875
可以被很容易的转换成二进制数1.111
,但是更多的小数是无法直接转换成二进制的,比如说