🚀DDL-数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型,复合函数。
🚀数值类型
类型 |
大小 |
有符号(SIGNED)范围 |
无符号(UNSIGNED)范围 |
描述 |
TINYINT |
1byte |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2bytes |
(-32768,32767) |
(0,65535) |
大整数值 |
MEDIUMINT |
3bytes |
(-8388608,8388607) |
(0,16777215) |
大整数值 |
INT/INTEGER |
4bytes |
(-2147483648, 2147483647) |
(0,4294967295) |
大整数值 |
BIGINT |
8bytes |
(-2^63,2^63-1) |
(0,2^64-1) |
极大整数值 |
FLOAT |
4bytes |
(-3.402823466 E+38, 3.402823466351 E+38) |
0 和 (1.175494351 E- 38,3.402823466 E+38) |
单精度浮点数值 |
DOUBLE |
8bytes |
(-1.7976931348623157 E+308, 1.7976931348623157 E+308) |
0 和(2.2250738585072014 E-308, 1.7976931348623157 E+308) |
双精度浮点数值 |
DECIMAL |
依赖于M(精度)和D(标度) 的值 例如123.45,精度指整个数值的长度是5,标度指的是小数位数是2 |
依赖于M(精度)和D(标度)的值 |
小数值(精确定点数) |
案例:假如在一张表中我们要去描述用户的年龄,我们可以选择age,那数据类型呢?
你写age int()肯定是可以,因为年龄的范围也在int里面,但是int占用的是4个字节,相对来说是比较暂用存储空间的,所以这里我们也可以选择TINYINT,可是对于age来说年龄会出现负数嘛?不会,所以我们要使用无符号的范围,我们可以在TINYINT后面加上标识UNSIGNED,age tinyint unsigned
假如要去描述一个人的分数score ,分数是有小数的,一般介于0-100之间,而分数这里一般让它出现一位小数就行了,这个时候可以考虑使用double
double里面要指定两个参数,double(参数1,参数2),参数1代表当前double整个长度是多长,例如100.0,最长是4位。参数2代表允许出现几位小数,分数一般让它出现一位小数,所以此时描述一个人的分数 score double(4,1)
🚀字符串类型
类型 |
大小 |
描述 |
CHAR |
0-255 bytes |
定长字符串(需要指定长度) |
VARCHAR |
0-65535 bytes |
变长字符串(需要指定长度) |
TINYBLOB |
0-255 bytes |
不超过255个字符的二进制数据 |
TINYTEXT |
0-255 bytes |
短文本字符串 |
BLOB |
0-65535 bytes |
二进制形式的长文本数据 |
TEXT |
0-65535 bytes |
长文本数据 |
MEDIUMBLOB |
0-16 777 215 bytes |
二进制形式的中等长度文本数据 |
MEDIUMTEXT |
0-16 777 215 bytes |
中等长度文本数据 |
LONGBLOB |
0-4 294 967 295 bytes |
二进制形式的极大文本数据 |
LONGTEXT |
0-4 294 967 295 bytes |
极大文本数据 |
char 与 varchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。
🚀举例:
char(10),即使你存储1个字符,它也会占用10个字符的空间,未占用的字符其他空间会使用空格进行补位
varchar(10),10代表最多存储10个字符,一旦超出10个字符将会报错。但是你存储一个字符就占一个字符空间,你存储两个字符就占两个字符空间,它会根据你的内容去计算你需要占用的空间
char ------> 性能高
varchar -----> 性能差
原因是varchar会根据内容去计算需要占用的空间
🚀案例:
用户名 username ------> 长度不定, 最长不会超过50
username varchar(50)
性别 gender ---------> 存储值, 不是男,就是女
gender char(1)
手机号 phone --------> 固定长度为11
phone char(11)
🚀日期时间类型
类型 |
大小 |
范围 |
格式 |
描述 |
DATE |
3 |
1000-01-01 至 9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
-838:59:59 至 838:59:59 |
HH:MM:SS |
时间值或持续时间 |
YEAR |
1 |
1901 至 2155 |
YYYY |
年份值 |
DATETIME |
8 |
1000-01-01 00:00:00 至 9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
TIMESTAMP |
4 |
1970-01-01 00:00:01 至 2038-01-19 03:14:07 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值,时间戳 |
创建包含日期类型的表TODAY
create table today (t1 datetime , t2 date, t3 time ,t4 timestamp , t5 year) ;
🚀复合类型
类型 | 最大值 | 说明 |
枚举类型enum("value1","value2",.....) | 65535 | 该类型的字段只能容纳所列值之一或为null |
集合类型set("value1","value2",.....) | 64 | 该类型的字段可以容纳一组值或为null |
enum类型的字段只允许从集合中选择某一个值,类似于单选按钮的功能,例如,定义一个人的性别只能从集合{”男“,”女“}中选择一个
set类型的字段可以允许从集合中选择多个值,类似于复选框,例如,定义一个人的爱好可以从集合{”唱歌“,”跳舞“,”乒乓球“,”旅游“}
它们两者在数据库内部并不是以字符的方式去存储的,而是使用一系列的数字,因此数据处理时效率高
🚀案例
生日字段 birthday
birthday date
创建时间 createtime
createtime datetime
🚀表操作-案例
设计一张员工信息表,要求如下:
- 编号(纯数字)
- 员工工号 (字符串类型,长度不超过10位)
- 员工姓名(字符串类型,长度不超过10位)
- 性别(男/女,存储一个汉字)
- 年龄(正常人年龄,不可能存储负数)
- 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
- 入职时间(取值年月日即可)
create table emp ( id int comment '编号', workno varchar(10) comment '员工工号' , name varchar(10) comment '员工姓名' , gender char(1) comment '性别' , age tinyint unsigned comment '年龄' , idcard char(18) comment '身份证' , entrydate date comment '入职时间' ) comment '员工表' ;
我们可以再用desc emp语句去查看一下我们所创建的表,如下图:
有一点是需要注意的:表结构创建好了,里面的name字段是varchar类型,最大长度为10,也就意味着如果超过10将会报错