MySQL的字段类型(数据类型)

MySQL的字段类型

创建表的完整语法

create table 表名(
	字段名 字段类型(数字) 约束条件,
	字段名 字段类型(数字) 约束条件,
 	字段名 字段类型(数字) 约束条件
);
  1. 字段名字段类型是必须的

  2. 数字约束条件是可选的

  3. 约束条件也可以写多个,空格隔开即可

  4. 最后一行结尾不能加逗号

在创建表的完整语法中,我们可以看见有很多概念,像python中的数据类型一样,表的每个字段也要有存储的形式,被称为字段类型,它决定了该字段下数据的数据类型。

约束条件 关键字 描述
无符号数 unsigned 变动数字字段的表示范围,从正负数变为无符号数
用零填充 zerofill 用零填充数字类型没有到最大限制的位数
非空 not null 此字段下记录的数据不能空
默认值 default 记录时没插入时的默认值
唯一值 unique 此字段下所有的数据不能重复
主键 primary key 是便于数据纵向标识的键值
自增 auto_increment 配合主键使用, 自动生成自增的主键值
外键 foreign key 建立表间关联的约束条件
级联更新 on update cascade 被关联数据修改时,建立关联的字段数据同步修改
级联删除 on delete cascade 被关联数据删除时,建立关联的字段数据所在记录同步删除

字段类型之整型

整型类型关键字 字节数 可表示范围 可加装约束条件
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存储就够了:

image

字段类型之字符类型

字符类型关键字 存储方式 优点 缺点
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');

image

字段类型之枚举与集合

关键字 含义
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');

查看结果:

image

集合

create table t8(name varchar(16),hobbies set('二次元','三次元','四次元'));  # 爱好可以有多个,用集合
insert into t8 values('糖豆人','异次元');  # 报错
insert into t8 values('chunai','二次元');  
insert into t8 values('leethon','二次元,三次元,四次元');  # 可以一次添加多个,引号中逗号隔开

查看结果:

image

字段类型之日期类型

日期类型关键字 描述
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:涉及到日期相关字段一般都是系统自动获取,无需我们手动操作,这里仅作演示。

image

posted @ 2022-11-23 19:03  leethon  阅读(144)  评论(0编辑  收藏  举报