MySQL的字段类型
创建表的完整语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
-
字段名和字段类型是必须的
-
数字和约束条件是可选的
-
约束条件也可以写多个,空格隔开即可
-
最后一行结尾不能加逗号
在创建表的完整语法中,我们可以看见有很多概念,像python中的数据类型一样,表的每个字段也要有存储的形式,被称为字段类型,它决定了该字段下数据的数据类型。
字段类型之整型
整型类型关键字 | 字节数 | 可表示范围 | 可加装约束条件 |
---|---|---|---|
tinyint | 1bytes | 默认-128~127(正负号占1bit) | unsigned,zerofill |
smallint | 2bytes | 默认-215~215-1 | unsigned,zerofill |
int | 4bytes | 默认-231~231-1 | unsigned,zerofill |
bigint | 8bytes | 默认-263~263-1 | unsigned,zerofill |
每种整型都是存储整数数字的,只是表示的数据范围不一样,但是用法都一样。
整型后不用跟(数字)
,MySQL会默认帮我们加,加不加都是一样的,这个数字指的是限制存储长度。
create database field_type_test; # 创建一个测试字段类型的库
use field_type_test;
create table t1(id tinyint);
insert into t1 values(-129),(128); # 报错
create table t2(id tinyint unsigned); # 创建无符号数的字段
insert into t2 values(-1); # 报错
insert into t2 values(255);
select id from t2; # 显示有一个255的值
严格模式
所有版本的MySQL都会有严格模式,包括这里演示使用的5.6版本,但是在我们配置my.ini
时可能会将严格模式的配置给覆盖掉,详细请看:https://www.cnblogs.com/Leethon-lizhilog/p/16915231.html 的最后小节。
严格模式的作用是:如果一个数据超出了我们存储的范围,那么就应该不做数据存储。而如果不加严格模式,上述的代码向tinyint插入一条128这样一个整数,那么MySQL也会存储这个数据,但是做了处理存储为127。显然这样的数据就没有意义了,所以严格模式很有必要。
字段类型之浮点型
浮点型类型关键字 | 精确度 | 描述 |
---|---|---|
float(size,d) | 日常够用 | 带有浮动小数点的小数字 |
double(size,d) | 精确度更高 | 带有浮动小数点的大数字 |
decimal(size,d) | 十分精确 | 精度更高的浮点数,允许固定的定点数 |
size指最大存储位数,d指小数位最大位数
create table t3(id float(65,20));
create table t4(id double(65,20));
create table t5(id decimal(65,20));
insert into t3 values(1.11111111111111111111);
insert into t4 values(1.11111111111111111111);
insert into t5 values(1.11111111111111111111);
运行结果如下,每种浮点型就是数据精度不一样,日常用float存储就够了:
字段类型之字符类型
字符类型关键字 | 存储方式 | 优点 | 缺点 |
---|---|---|---|
char(size) | 定长存储,空格填充 | 整存整取需要更少的IO,存取快 | 数据存储不够灵活,一些场景很浪费空间 |
varchar(size) | 变长存储,有几位存几位 | 面对长度不一的数据存储更灵活,节省存储空间 | 取出需要先读报头再根据报头取数据,两次IO,存取慢 |
size指存储字符最大长度,超出这个范围存储会报错(严格模式下)
针对定长存储和边长存储我们要权衡存储空间和存取速度之间选择更加合适的方案。
如存储中文姓名,大部分都是两个字或三个字,但是也有四个字的和少数民族很长的名字,这种就要采取变长存储。而如果存储学号,则所有的学号都是一个格式,就可以采取定长存储来达到更快的存取。
create table t6(name varchar(16), stu_number char(10));
insert into t6 values('leethon','12345');
insert into t6 values('jj','00001');
字段类型之枚举与集合
关键字 | 含义 |
---|---|
enum(数据1,数据2,。。) | 枚举,从多个选一个 |
set(数据1,数据2,。。) | 集合,从多个选多个 |
枚举
create table t7(name varchar(16), gender enum('male','female','others')); # 性别只有一个,用枚举
insert into t7 values('leethon','male');
insert into t7 values('zhonger','猛男'); # 报错,必须输入枚举中的一个
insert into t7 values('renyao','others');
查看结果:
集合
create table t8(name varchar(16),hobbies set('二次元','三次元','四次元')); # 爱好可以有多个,用集合
insert into t8 values('糖豆人','异次元'); # 报错
insert into t8 values('chunai','二次元');
insert into t8 values('leethon','二次元,三次元,四次元'); # 可以一次添加多个,引号中逗号隔开
查看结果:
字段类型之日期类型
日期类型关键字 | 描述 |
---|---|
datetime | 年月日时分秒 |
date | 年月日 |
time | 时分秒 |
year | 年 |
create table t9(
id int,
name varchar(32),
register_time datetime,
birthday date,
study_time time,
work_time year
);
insert into t9 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
ps:涉及到日期相关字段一般都是系统自动获取,无需我们手动操作,这里仅作演示。